{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "6HPvYgkOjlHg"
   },
   "source": [
    "# 逻辑回归 Logistic Regression\n",
    "\n",
    "此Notebook是配合Andrew Ng \"Machine Leanring\"中[逻辑回归](https://github.com/loveunk/machine-learning-deep-learning-notes/blob/master/machine-learning/logistic-regression.md)部分学习使用。\n",
    "\n",
    "测试用python版本为3.6\n",
    "* 机器学习路径：https://github.com/loveunk/machine-learning-deep-learning-notes/\n",
    "* 内容正文综合参考网络资源，使用中如果有疑问请联络：www.kaikai.ai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "2bSRbRGTjlHi"
   },
   "source": [
    "在这一次练习中，我们将要实现逻辑回归并且应用到一个分类任务。我们还将通过将正则化加入训练算法，来提高算法的鲁棒性，并用更复杂的情形来测试它。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "WXk4cLxBjlHj"
   },
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "nfrEaVuajlHl"
   },
   "source": [
    "在训练的初始阶段，我们将要构建一个逻辑回归模型来预测，某个学生是否被大学录取。设想你是大学相关部分的管理者，想通过申请学生两次测试的评分，来决定他们是否被录取。现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集。对于每一个训练样本，你有他们两次测试的评分和最后是被录取的结果。为了完成这个预测任务，我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "2zO2vzfujlHm"
   },
   "source": [
    "让我们从检查数据开始。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "meEb58oJjlHn"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('fivethirtyeight')\n",
    "from sklearn.metrics import classification_report # 这个包是评价报告"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zqEIXn3sjlHr"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>exam1</th>\n",
       "      <th>exam2</th>\n",
       "      <th>admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.623660</td>\n",
       "      <td>78.024693</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30.286711</td>\n",
       "      <td>43.894998</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>35.847409</td>\n",
       "      <td>72.902198</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>60.182599</td>\n",
       "      <td>86.308552</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>79.032736</td>\n",
       "      <td>75.344376</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       exam1      exam2  admitted\n",
       "0  34.623660  78.024693         0\n",
       "1  30.286711  43.894998         0\n",
       "2  35.847409  72.902198         0\n",
       "3  60.182599  86.308552         1\n",
       "4  79.032736  75.344376         1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path = 'ex2data1.txt'\n",
    "data = pd.read_csv(path, header=None, names=['exam1', 'exam2', 'admitted'])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8r4bOK-K8J4i"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>exam1</th>\n",
       "      <th>exam2</th>\n",
       "      <th>admitted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>65.644274</td>\n",
       "      <td>66.221998</td>\n",
       "      <td>0.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>19.458222</td>\n",
       "      <td>18.582783</td>\n",
       "      <td>0.492366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>30.058822</td>\n",
       "      <td>30.603263</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>50.919511</td>\n",
       "      <td>48.179205</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>67.032988</td>\n",
       "      <td>67.682381</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>80.212529</td>\n",
       "      <td>79.360605</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>99.827858</td>\n",
       "      <td>98.869436</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            exam1       exam2    admitted\n",
       "count  100.000000  100.000000  100.000000\n",
       "mean    65.644274   66.221998    0.600000\n",
       "std     19.458222   18.582783    0.492366\n",
       "min     30.058822   30.603263    0.000000\n",
       "25%     50.919511   48.179205    0.000000\n",
       "50%     67.032988   67.682381    1.000000\n",
       "75%     80.212529   79.360605    1.000000\n",
       "max     99.827858   98.869436    1.000000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "bvQFnaZojlH1"
   },
   "source": [
    "让我们创建两个分数的散点图，并使用颜色编码来可视化，如果样本是正的（被接纳）或负的（未被接纳）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4VZ-TIUmjlH3"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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+epcKy0tlST97ne/6w1tHHP41a9+JYPBoKeffrr3uKevHyNkxc3/+3//T3//+98lSe+//76knlSzurpakjRv3jxdcMEFkqSlS5fqhRde0OrVq/Xuu+9q1qxZ2r59u1588UXNmDFDS5cudXrsr33ta7r11ltVUFCgOXPmKCsrSwcOHNDTTz+tgwcPavXq1UNq4wb/6BvaOMTk5yvq/vtl3L2795gjvJHEyhsAAABghNi0KUINDa6LzNbXG1RVFaHMzG4/zaq/yspK7du3T9dcc41TUd3LL79c5eXlWrduXe8Oju3bt2v06NFO9WQczjjjjN6VO4dLSUlx2k0iqbd2zrRp0/oV43Xc9tlnn3n8utzxz3/+U2azedB5x8TEaOfOnb1/9/T1Y4QEN479gX298cYbeuONNyT17MFzBDdms1kbNmzQvffeq+eee07V1dWaMGGCFi9erFtuuaXfCS9JN998syZNmqSSkhL9+c9/1qhRo3Tqqadq+fLl+uY3v+n7F4ghMdbV9Qttem/rE9o4OMIb66xZ1LwBAAAARoDi4qh+K20O19pqVFFRVECDm3Xr1klSvxUj5557riZMmKCKigrde++9vU1xjjvuuAEfJyEhYdDniI2N7XfMsWLF1W2+bo395Zdfqru7W/fee++gY9ra2nr/39PXjxES3JSUlKjkq20w7oiLi9PKlSud9gAeyaWXXqpLL73Uk+nBz2wpKeooKFDMAPssB9NRUEBoAwAAAIwQzc3utXR2d5wvNDQ06JVXXpGk3m1SAykvL9ePfvQjjRkzRl988cWAYxobG30yR1+KjY2VwWAYtDnQ4ULt9fvTiAhugMM5ChG7E960FxY6FS4GAAAAENzi4twrOuzuOF9Yv369bDabzjjjDH3ta1/rd3tXV5eeeOIJrV27Vj/60Y80ffp0bdmyRW+//Xa/7UKO0iD+5lid42infTij0Tjobd/61rf04osvateuXW51Yg7G1z9SENxgxOrKze1X0+ZwtuRkQhsAAABghMnL61RNjdHldimLxaYlSzr9OKtD7Ha71q9fL4PBoJKSEh1//PEDjqutrdVbb72l999/X5dddpm2bNmigoICp65K7733np544gk/zv6QsWPHSpI++eQTTZ48ecDbP/nkkwHve9111+nFF1/UkiVLtH79eo0bN87p9j179qipqUknnniiJAXl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KLdw8803a8yYMbr33nt14MCBQcc1NDTob3/7m0466ST98Ic/dLrthz/8oU488US99tpr/bZMearvNimHyy+/XDabrV+npieffFLd3d1avHhxb2ghSWPGjNHNN9/s8nlWrFjRG9pIUlZWlkaNGqXm5mbdfffdvaGNJP3gBz+Q1LOFyZcee+wx7d+/X7fffrtTaCNJF198sWbOnKnyPtecw3n9vsSKG/iNqzdh4+7d/Y453oSts2bJ9tUyQQBAaGH1DHzJk+14cJ8jQGWbGbzJlpKijoICpw91j6SjoCAorhfGjh2r66+/XnfddZdKSkp00003DTju3XfflSTNmTOnt8uTg8FgUFpamnbs2KHt27c7rYbxxP/+9z+99NJLOuGEE/SNb3yj93h2drby8/O1fv16LVu2rHcejiAlLS2t32OdccYZLp/r61//utPfTSaTjj76aLW1tfULTY455hhJ0meffTb0FzUE//znP3v/rBsg3Ovs7NTevXu1d+9ejR8/fliv35cIbuA3I/lNGADgO1z8wVeoxQKMTI4amO5cN7QXFjrVzAy03NxclZWVafXq1frxj3884JiWlhZJclrR0VdCQoIkaf/+/cOez2OPPSar1arLLrvM6Xh8fLwyMjJUUVGhv/3tb/r2t7/t9JxHHXXUoPMazEC1akwm04DHHatvDh486N4L8dCXX34pSSorK3M5rq2tTePHjx/W6/cltkrBr7pyc9VeWOjW2GB7EwYAACPLcLbjAQisrtxc2ZKTXY6xJScH3fVCTEyMbr31Vu3fv1+//e1vBxwTGxsrSfr8888HvN1x3DFuONatWydJuvvuu506MsXHx/fW0HFspZIOhS9ffPFFv8dqbGwc9nz8zfE13Lp1q5qamgb9b9KkSZKC9/UT3MDvRuqbMAAAGHmoxQKMTJElJQOWU+jLuHt3v1bhweCqq67SCSecoAcffHDAOjWOjkdbt26V3e78HmS32/X3v//daZyk3i5V1gHKTgzm9ddf165duzR58mQtXLhwwP/Gjh2rDRs2qKmpSZI0ffr03rkdzjEvfzvSa3d1+7e+9S1J0rZt29x6rmB8/RLBDQJgJL8JAwCAkYdi1sDI0rfb7JHE5OcH3XWDyWTSbbfdps7OTq1atarf7UlJSTrzzDNVW1vrtNpF6ln9Ultbq7POOsupvs3YsWMlSZ988onb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Oj3yyCP65S9/qdDQUN1999165ZVX9J///KfKeGrDtZSVlWnRokXq37+/QkND1a5dOw0bNkwbNmywOZ76cE6rVq3SK6+8ogceeEAhISEKCgrSihUrqh1/I3Xwt7/9TQ899JDatGmjsLAwPfnkk/r+++8b4uXUK7ecnJyq7+TRaGVmZur+++/X3XffrYiICAUHB+vcuXPatGmTzp07p+eee07z58+3jC8oKNCQIUO0f/9+Pfjgg+revbsyMjL05Zdfqlu3btq0aZP8/Pwc+IrQkA4fPqz+/fvL09NTBQUFSktLU69evazGUCOupVu3bsrNzZXJZKpy784779SQIUMsH1Mbrqe8vFwTJkzQBx98oPDwcA0YMED+/v46deqUdu7cqcWLF+vee++VRH24on379umLL76weW/dunU6ePCg3nzzTY0fP14SNeJq/vCHPyg5OVmtW7fWsGHDFBAQoIyMDG3dulX+/v7avHmzbr/9dknUhqspLy/Xc889p3Xr1ik8PFwDBw5UcXGxNmzYoHPnzmnOnDn6/e9/bxlPfTivbt266cSJE2revLmaNm2qEydOKDk5Wc8880yVsTdSB3PnztXMmTPVtm1bDR8+XAUFBUpNTVVRUZFWr16t+++/314vtc48HT0B1K+wsDBlZWXJ09P6jzYvL0+DBg3S0qVL9eKLLyoyMlJSxWqL/fv3a/z48XrzzTct42fNmqU5c+Zo/vz5io+Pt+trgH2UlpbKZDKpa9eu6tixoz755BOb46gR1xMYGKipU6dedxy14Xref/99ffDBB4qJidH//u//ysPDw+p+SUmJ5ffUh+u54447dMcdd1S5XlxcrMWLF8vT01OjRo2yXKdGXMeZM2eUkpKi9u3bKz09Xc2aNbPcW7hwoeLj45WcnKzk5GRJ1IarWbdundatW6c+ffpozZo18vX1lSRNnz5dDzzwgKZNm6bBgwcrLCxMEvXhzN59911FRESoffv2mjdvntWf77XqWgfHjh1TUlKSfvGLX+irr75SYGCgJOmFF17QgAED9PLLL2vPnj1V3kcbBVulnIyHh4fNYgsICNBDDz0kqWJVjlSRbi9btkz+/v6aNGmS1fiJEycqKChIy5cvt7m9Co3fn//8Z2VkZGjBggVV3nyZUSOoDrXhegoLCzV79mx16NBBSUlJNr9vmP/9oT5Q2fr163XhwgUN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eeYZeXp6au7cuVbfhw4ePKiPP/5Y4eHh6t+/v91eQ1255eTklDt6Eqg/U6ZM0bJly9SvXz+1b99eTZs21YkTJ7Rlyxbl5+frscce0wcffCB394rMrqCgQEOGDNH+/fv14IMPqkePHsrIyFBaWpq6deumTZs2WSWYcE4mk0krV65UWlqaevXqZXWPGnEdSUlJeuedd9S/f3+1b99eTZo00cGDB7V161a5u7tr3rx5VlseqA3Xc/z4cT388MM6d+6cBg8erNtuu0379u3T9u3b1a5dO3355ZeWYzapD9fWt29fHThwQDt37lSXLl1sjqFGXEdpaamGDx+u9PR0tWjRQkOHDlVQUJAyMjK0bds2NWnSRJ999pnuvfdeSdSGK+rdu7duvfVWderUST4+Pvruu++Unp6uDh06aN26dZYVvxL14cw+/PBD7d69W5J04MAB7d27V3369FF4eLgkKSoqyrKK80bq4K233lJiYqLatm2r4cOH6/Lly1q9erUKCwu1evVqghvYz+7du7Vs2TL985//1OnTp3X58mUFBwere/fuevrppzVy5MgqCbT56PB169bpzJkzatWqlR577DFNnjy52l4GcC41BTcSNeIq0tPTtWTJEu3du1fnzp1TUVGRQkJC1KdPH8XGxqpnz55VHkNtuJ7s7GzNmjVLX331lS5cuKBWrVpp6NChmjRpUpVjNqkP1/Tdd99pwIAB6tmzp7766qsax1IjruPKlSt67733lJqaqqNHj6q4uFghISG67777NGHCBN1+++1W46kN15KUlKTPP/9cJ06c0NWrVxUWFqZHH31UL7/8ss2GsdSHczK/J6nO5MmTNXXqVMvHN1IHn3zyiVJSUnTo0CF5eXmpd+/eio+P11133VXvr6c+EdwAAAAAAAAYFD1uAAAAAAAADIrgBgAAAAAAwKAIbgAAAAAAAAyK4AYAAAAAAMCgCG4AAAAAAAAMiuAGAAAAAADAoAhuAAAAAAAADIrgBgAAAAAAwKAIbgAAAAAAAAzK09ETAAAAxhcVFaWdO3fWamxOTk7DTsagDh06pJ07d+r777/X999/r8OHD6ukpESjRo1SSkrKTT33hQsXtHjxYqWlpeno0aMqKChQUFCQWrZsqc6dO6tv374aMmSI2rVrV0+vBgAAGAXBDQAAqLW2bduqbdu2jp6GIc2YMUMbNmyo9+f9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4MGDkmQzXLElMzPT0qi4uj+X4OBghYaGKjs7W0eOHLH53L/85S9tPta8gik9PV1DhgyxOaaoqEiSdPLkyVrNGQAAV0BwAwAA7KJ79+665ZZb9PPPP8vf319PPPFEtWPj4uK0b98+dejQQdOmTVPv3r0VEhKiJk2aSKpYhbJq1SpdvXrV5uObNm1q87qbm1utx5SVldXqddmTh4eHunXrpm7duunZZ59Vbm6u4uLitH79em3evFl79uxRr169JMnSdNhWgGVLfn6+pIotY7fccku141q3bq3s7GzL+GtVXvVTWU5OjiTpxIkTOnHiRI1zKSwsrMWMAQBwDfS4AQAAdhEXF6eff/5Z7u7uys/P14QJE2yOO3PmjL766itJ0scff6yRI0eqXbt2ltBGki5evGiXORtdYGCgkpOT5e5e8SPdnj17LPfMJ1Ll5ubW6rnM/YRKSkqqXckkVayGqjy+tsyBTlJSknJycq77CwAAVCC4AQAADe7999/Xxo0bFRwcrM8//1zNmjXTmjVr9OGHH1YZm5WVJaliW07nzp2r3C8pKam2KbErCgwMVIsWLSTJagXS7bffLkn65ptvavU8ERERlkbNBw4csDkmJyfHcjJYdVuiqlPX+QAAgAoENwAAoEHt379f06dPlyS9++67uu+++zRv3jxJ0pQpU3T48GGr8eZmxXl5eTb7zHz00Uc6f/58A8/aGH7++efrbtk6evSozp07J6niGHUz8xHrS5curXEFjZmfn5/uu+8+SVJycrLNMQsXLlRpaalatmxpdSpUbTz++OOSpC+++KLaYAgAAFRFcAMAABrM5cuXNXbsWF25ckW/+93v9Mgjj0iSRo4cqWeeeUaXL1/Wb3/7W0tTWkmKjIxU8+bNVVJSotdee82q38maNWs0efJk+fj42P21OMLq1avVp08fpaSk6KeffrK6V15erq+++kqjR49WeXm52rZtqwEDBljujxkzRp06ddLZs2f1+OOPVzne/PTp05o7d65VOPbaa6/Jzc1NGzdu1Jw5c1RSUmI1l/nz50uSJk6caHVUeG3ce++9GjFihK5evaqRI0dq48aNllPCzLKysvTOO+/YXIkFAICrojkxAACotRUrVujvf/97jWMWLlxoObFp8uTJOnLkiG6//XYlJiZajZszZ46+/fZb/fvf/9a0adP0pz/9SVJFc9w33nhD48aN08qVK/XFF18oIiJCZ86c0alTpzRgwAA1b95cn3zyScO8yBu0evVqvf7665aPL1++LElKTU3V5s2bLdf/9Kc/aeTIkbV6Tjc3Nx05ckRTp07V1KlT1bp1a7Vu3VpXr17VTz/9ZOkFExISouXLl1sdre7r66uPP/5YTzzxhPbu3at+/fopLCxMzZs316lTp3T69GmVl5dr7Nixlsfcf//9SkxMVEJCgmbNmmX5szx9+rTlpKfRo0frxRdfvKGv0cKFC3XlyhVt3LhRo0aNUnBwsMLDw1VWVqaTJ0/q7NmzkirqBgAAVCC4AQAAtZadna3s7Owax5hPG1qzZo2WLVsmX19f/fWvf62ySsbPz09LlizRoEGDtHjxYj3wwAOKioqSVLFaJDg4WO+8847279+vo0ePKjw8XLGxsTKZTBo3blzDvMCbUFRUZHNL0pUrV3TlyhWrcbX1m9/8Rl26dNG2bdu0e/du/fTTTzp69KiuXr2qoKAg3X///Xr44Yf161//2ubpUREREdqxY4eWLFmidevW6ciRIzp9+rRCQkL08MMP69FHH7U0MTaLi4tT7969lZycrH/84x/av3+//P399eCDD+r555+3bMG6EU2bNtVHH32kTZs2acWKFfruu++UkZEhPz8/hYaGqn///ho6dKgGDRp0w58DAABn45aTk1N+/WEAAAAAAACwN3rcAAAAAAAAGBTBDQAAAAAAgEER3AAAAAAAABgUwQ0AAAAAAIBBEdwAAAAAAAAYFMENAAAAAACAQRHcAAAAAAAAGBTBDQAAAAAAgEER3AAAAAAAABgUwQ0AAAAAAIBBEdwAAAAAAAAYFMENAAAAAACAQRHcAAAAAAAAGBTBDQAAAAAAgEH9f2gQneG3WXbKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "positive = data[data['admitted'].isin([1])]\n",
    "negative = data[data['admitted'].isin([0])]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12,8))\n",
    "ax.scatter(positive['exam1'], positive['exam2'], s=50, c='b', marker='o', label='Admitted')\n",
    "ax.scatter(negative['exam1'], negative['exam2'], s=50, c='r', marker='x', label='Not Admitted')\n",
    "ax.legend()\n",
    "ax.set_xlabel('Exam 1 Score')\n",
    "ax.set_ylabel('Exam 2 Score')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "2dp3JtvpjBYR"
   },
   "outputs": [],
   "source": [
    "\n",
    "def get_X(df):\n",
    "    ones = pd.DataFrame({'ones': np.ones(len(df))})  # ones是m行1列的dataframe\n",
    "    data = pd.concat([ones, df], axis=1)  # 合并数据，根据列合并\n",
    "    return data.iloc[:, :-1].values  # 将这里的as_matrix替换为values\n",
    "\n",
    "def get_y(df):#读取标签\n",
    "#     '''assume the last column is the target'''\n",
    "    return np.array(df.iloc[:, -1])#df.iloc[:, -1]是指df的最后一列\n",
    "\n",
    "\n",
    "def normalize_feature(df):\n",
    "#     \"\"\"Applies function along input axis(default 0) of DataFrame.\"\"\"\n",
    "    return df.apply(lambda column: (column - column.mean()) / column.std())#特征缩放"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mMuhs2-hjBYW"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100, 3)\n",
      "(100,)\n"
     ]
    }
   ],
   "source": [
    "X = get_X(data)\n",
    "print(X.shape)\n",
    "y = get_y(data)\n",
    "print(y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8R0uQXSZjlH7"
   },
   "source": [
    "看起来在两类间，有一个清晰的决策边界。现在我们需要实现逻辑回归，那样就可以训练一个模型来预测结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "R_GK_8JhjlH8"
   },
   "source": [
    "## Sigmoid 函数\n",
    "$g$ 代表一个常用的逻辑函数（logistic function）为S形函数（Sigmoid function），公式为： \\\\[g\\left( z \\right)=\\frac{1}{1+{{e}^{-z}}}\\\\] \n",
    "合起来，我们得到逻辑回归模型的假设函数： \n",
    "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "6yd5Ddl2jlH-"
   },
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4SG4dpr3jlID"
   },
   "source": [
    "让我们做一个快速的检查，来确保它可以工作。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "FN4JMcM2jlIE"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABGkAAALsCAYAAABQuer6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACH3klEQVR4nOzdd3hUZfrG8ftMy4SQEJqwSFNQY8UVUSmCAgIiIhJAwFVwdxF1bdiR4uoqWNbGuvpb1ooivQsKCyhNFBUVOy7So5RIIAQm087vj5gsMDMhdc6U7+e6ciXzvGfeeSYvJdy85xwjLy/PFAAAAAAAACxls7oBAAAAAAAAENIAAAAAAADEBEIaAAAAAACAGEBIAwAAAAAAEAMIaQAAAAAAAGIAIQ0AAAAAAEAMIKQBAAAAAACIAYQ0AAAAAAAAMYCQBgAAAAAAIAYQ0gAAkATGjx+vzMxMXXHFFVa3EnWZmZnKzMzUqlWrLHn+N998o6FDh+q0005T3bp1lZmZqQ4dOlRornhT2e8dAADJxmF1AwAAAIlqy5Yt6tGjh/Lz8yVJtWvXltPpVN26dS3urHJefPFF7d+/X1dccYXOOeccq9sBACBhENIAAJAE6tatq1NOOUWNGze2upWoO+WUUyRJNWrUiPprv/7668rPz9fJJ5+sBQsW6MQTT4x6D9XhpZde0vbt29W0adNSQxorv/cAAMQjQhoAAJLAjTfeqBtvvNHqNizxySefWPba3377rSSpZ8+eCRPQlIeV33sAAOIR16QBAACoJocOHZIkpaWlWdwJAACIB4Q0AADEoTlz5qhfv3465ZRTVK9ePTVt2lTnnXeeBg4cqH//+9/yeDxHHV+WCwcvXLhQvXv3VtOmTXXiiSeqffv2ev755+Xz+Up9/hVXXKHMzEyNHz9egUBA//znP3XxxRfrxBNPVMuWLTV48GB99dVXJccfOnRITz31lNq2batGjRrppJNO0g033KDNmzeX+p537dqlMWPG6KKLLtKJJ56oRo0a6aKLLtLYsWO1e/fuiM873sVr8/LyNGbMGJ177rlq0KCBTjvtNA0ZMkRffPFFqf2U5uyzz1ZmZqZWr14tSXriiSdK+jiyl7Ksy6pVq0qed6xjn79ixQoNGDBALVq0UIMGDXTBBRfo8ccfD/n1cKxff/1VTzzxhLp06aLmzZurQYMGOvvss9W3b1+9+uqr2r9//1Gvt337dknSX/7yl6Pe17E9Hu977/F49OKLL6pbt25q1qyZGjRooLPOOkvDhw/Xhg0bIvZb/P2dPHmyvF6vJkyYoPbt26tRo0Zq2rSprrzySi1durTU9wwAQCzidCcAAOLMrbfeqrfeeqvkcc2aNeX3+/XTTz/pp59+0nvvvVfyj96yGj16tF544YWSx7Vq1dIPP/yghx56SIsXL1bbtm2PO4ff71d2drY++OADuVwuOZ1O7d27V4sWLdLKlSu1YMECNWvWTH369NGGDRvkdrtlGIb27dunOXPmaPXq1Vq+fLmaNGkSMvfq1at17bXXloQFNWrUkGEY+v777/X9999r0qRJmjJlSpn6PNLWrVvVq1evktDB5XLp8OHDmjdvnt599129/vrr5ZqvWL169VRYWKh9+/bJ5/MpLS3tqN00LperQvOWZsKECXrooYckSRkZGfJ6vdq4caMef/xxrVmzRnPnzpXdbg953vLly/XHP/5ReXl5kiSHw6G0tDRt375d27dv1/Lly3XCCSeoV69eqlmzpk444QTt3btXwWBQGRkZcrvdFeo3JydH/fr1KzklzOl0KjU1VTt27NC0adM0Y8YMjR8/XsOHD484R0FBgXr27KlPP/1UTqdTKSkpOnDggFatWqXVq1drwoQJuu666yrUHwAAVmAnDQAAcWTt2rV66623ZLPZ9PDDD2vz5s3asWOHcnJy9NNPP2n27NkaNGhQuUKAWbNmlQQ0/fv317fffqutW7dqx44dev7557V+/Xq98sorx53n5Zdf1oYNG/TGG29o586d2rFjh5YvX67mzZvr4MGDeuCBB3T77bcrLy9Ps2fPVk5Ojnbu3Kl58+apXr162rNnj/72t7+FzLtjx46SgCYrK0vvvfdeyXMXLVqkU045RXl5eRo8eLBycnLK/L4DgYCGDh2q7du3KzMzU6+//rpycnK0bds2ffTRR2rdurVuvvnmMs93pPfff18bN27UBRdcIKkoWNu4cWPJx4UXXliheSP5+uuv9de//lUjRozQf//7X23dulVbt27VfffdJ6loN87bb78d8rwvv/xSgwcPVl5enk4//XTNmDFDP//8s7Zu3aqcnBy9//77uvXWW5Weni5Juu2227Rx48aS6+uMHz/+qPe1cePGMvUbCAR0/fXX69tvv1VGRoYmTpyonTt3atu2bfriiy/UvXt3BYNB3X///frPf/4TcZ5x48YpJydHkydPVk5Ojnbs2KFPPvlEbdq0kWmaGjlyZEmwBwBAPCCkAQAgjqxbt06SdMkll+iOO+5Q7dq1S8bq1Kmjzp0766WXXtLvfve7Ms1nmqbGjRsnSbr00ks1ceJENWrUSJLkdrs1ZMgQPf300yW7LEqzf/9+TZ48WVdddZWcTqcMw9B5552n559/XpL08ccfa9myZZo7d646d+4sm80mm82mTp06lewAWbBggXw+31HzPvPMM9q/f78yMzM1b948XXTRRSVj7dq109y5c5WRkaF9+/bp2WefLdP7lqT58+fr888/lyS98cYb6tOnjxyOok3GWVlZmjVrlurUqVPm+ay0f/9+3XvvvRo7dmzJ7b0zMjL04IMP6sorr5RUFMYd64EHHpDH41GLFi303nvv6bLLLpPT6ZRUtFvp97//vR599FF16tSpSvudN2+ePv30U0nSa6+9pgEDBpQEi82bN9fkyZN1/vnnS1LJr41wDh8+rLlz5+qKK64o6fuUU07RlClT5Ha7dfDgQS1evLhKewcAoDoR0gAAEEdq1aolSdq7d68CgUCl59uwYYM2bdokSbrrrrtkGEbIMYMHDy7Trbvbtm0b9nSjDh06KCUlRZLUu3dvnXzyySHHdOnSRVLRP7qL+5GKQqQ5c+ZIkv74xz+qQYMGIc898cQTdcMNN0gKH0REUnzsRRddFDaEqFGjhu64444yz2ellJQU3XbbbWHHevbsKUn65ptvjqpv2rRJa9eulSSNHTu25NdWNMyePVuSdMEFF5Ss/ZEcDofuv/9+SUV3yDq292JXXXWVTj311JB6vXr11KZNG0mh7xsAgFhGSAMAQBy55JJL5Ha7tWHDBl1++eWaNGmStmzZUuH5vvzyS0lF1wOJdAqOYRhq3779cec677zzwtbtdnvJ7o5Ix5xwwgklXx+5a2fr1q3at2+fJJW6m+PSSy+VVHQB3LJ+P4ovDHzxxRdHPKZjx45lmstqWVlZqlmzZtix4l1Vxd/HYh9//LGkovXp2rVr9TZ4jOLvfWlrevHFF5dcQ6d4x9OxWrduHfH5kd43AACxjJAGAIA40rx5c02YMEE1a9bUunXrdPvtt+vcc89Vy5YtdcMNN2jhwoUyTbPM8+Xm5koqOlWqtOvYFJ8CVZpIIYGkkn9sRzqm+DQjSUed7rRnz54y9XDk2N69e4/b65Fzl3XeWFaW773f7z+qXnxHrLp160b9FuFl+d673e6ScC/SmpblfR97+hwAALGMkAYAgDgzYMAAffXVV3r22WfVt29fNW7cWHv37tWcOXN07bXXqmfPnjpw4ECZ5ioOdMKd5hTuOCsdr8fyHleW48s7Vzyy8j1W15oCABCvCGkAAIhDtWvX1g033KBXX31VX3/9tT7//HONGDFChmFo7dq1evzxx8s0T7169SQV7ajxer0Rj/v555+rpO/yql+/fsnXO3fujHjckXd1Kt59Uda5yzpvdSjeQVRYWBjxmLIGbuVVfH2fvXv3qqCgoFpeI5Li7/2OHTsiHuPxePTrr79KKvuaAgAQ7whpAABIACeddJIeeugh9e/fX5L0wQcflOl5rVq1klR0SkjxNUqOZZqmPvzwwyrps7yaNWtWcgerFStWRDyu+P3WqVNHzZs3L9Pc5557riRp9erVEY9ZuXJlmeaqqMzMTEmlB0WfffZZtbx28TWIAoGAli5dWq7n2mxFP0JWdIdV8fe+tO/v6tWrS07RinQtIwAAEg0hDQAAcaS0HRdS0XU8pP/9I/p4zjnnnJK7LT333HNh/9E9bdo0bd++vZydVg3DMNS3b19JRbdq3rVrV8gxP//8s1577TVJUnZ2dpnnLp537dq1WrVqVcj44cOHNWHChIq0XWZnnXWWpKL38Mknn4SM79mzR2+88Ua1vPbJJ5+sdu3aSZIeeeSRcu3YSU9Pl1R06++KKF6ndevWafny5SHjfr9fTz75pCTpjDPO0BlnnFGh1wEAIN4Q0gAAEEfuvfdeDR06VPPmzTvqoroHDx7Uq6++qqlTp0qSunXrVqb5DMPQyJEjJUnLli3TTTfdVHJqk8fj0aRJkzRixIiSHR9WuOuuu1SrVi3t27dPffr0OWrHz0cffaQ+ffpo//79ql27tkaMGFHmeXv37l2yk+j666/XvHnzSm5r/sMPP6hfv35HfY+rw4UXXqgmTZpIkm655RZ9/vnnMk1TwWBQq1atUq9evRQMBqvt9R9//HG53W5t2rRJPXr00NKlS0sutHvo0CF9+umnGjFiRMjOrOLQZP78+UfdjausevfurfPPP1+SNHToUM2YMaPkdbds2aLrrrtO69atkyQ9/PDDFXx3AADEH8fxDwEAALHC5/Np7ty5mjt3rqSiu9vY7fajdjS0bdtWd999d5nn7N+/v9avX6+XXnpJ06ZN0/Tp01WrVi0VFBTI5/OpY8eOOv/88/XMM8+U7NSJphNPPFGTJ0/W4MGD9d1336l79+4ldyMqvpZKrVq1NHny5HLdjcnhcOiNN95Qr169tGPHDg0ZMkQpKSlKSUnRgQMH5HK59Prrr2vw4MHV8r6koh1Pzz33nAYOHKgff/xRl156qWrUqKFgMCiPx6MWLVro73//u/70pz9Vy+ufc845evvttzV06FB9++236tevn5xOp9LS0o4KX7p06XLU84YMGaIZM2bo448/VosWLVS/fn05nU5J0ldffXXc17Xb7Zo0aZKys7P13XffadiwYfrLX/6i1NTUkl/LNptN48aN02WXXVZ1bxgAgBjHThoAAOLIfffdpyeeeEK9evXSqaeeKrvdroKCAtWvX1+XXnqpXnjhBb3zzjvlvqXy+PHj9eabb6pDhw5KT0+X1+vVqaeeqr/97W+aPXv2UWGIFTp06KBPPvlEt956q0477TQFg0GZpqnTTjtNt912m9atW1dy6k55NG/eXKtWrdJf/vIXNWvWTKZpyu1266qrrtKSJUvUs2fPang3R+vSpYveffddde/eXZmZmQoEAjrxxBNLdrCccMIJ1fr6nTt31vr163XPPffonHPOUWpqqjwej5o2baouXbroueeeU8eOHY96Tvv27TV9+nRdcsklysjI0O7du7V9+/ZynRbXqFEjvf/++3rsscfUpk0bud1uHT58WI0bN9Y111yjDz74QDfddFNVv10AAGKakZeXZ/09NQEAQEzr3r27Pv74Yz344IO67777rG4HAAAgIbGTBgAAlGr16tUl14Hp2rWrxd0AAAAkLkIaAACge+65R5MnT9auXbtK7vCUl5en1157reSaLB07duRWyAAAANWI050AAIA6dOigr7/+WpKUkpJScgHX4sAmKytLs2fPLteFeQEAAFA+hDQAAECLFi3SO++8o/Xr12v37t06cOCA0tPTlZWVpSuvvFJDhw5VjRo1rG4TAAAgoRHSAAAAAAAAxACuSQMAAAAAABADCGkAAAAAAABiACENAAAAAABADCCkAQAAAAAAiAGENEnC4/Hop59+ksfjsboVRAlrnnxY8+TDmicX1jv5sObJhzVPPqw5jkVIk0QCgYDVLSDKWPPk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V6Zpym6365JLLlG7du10/vnn65xzzlHt2rWP2iVTWFioLVu26NNPP9Vnn32mJUuWaOfOnRo3bpwmTpyokSNHasiQIbLZuDQOAABAWRn79snx3nsh9WDTpgq0bWtBRwAAoCqUOaS56KKL5Pf7lZWVpeuvv179+vVT/fr1S31OSkqKTjvtNJ122mm69tprZZqmVq9eralTp2rmzJm6++67tW/fPt11112VfiMAAADJwjl7tgyfL6TuveYaif/8AgAgbpU5pGnZsqXuvfdeXX311RW+poxhGLr44ot18cUX68EHH9QzzzzDLhoAAIByckY41Ym7OgEAEN/KHNJ8+OGHVXrB3xNPPFFPP/30Ude0AQAAQOnsmzbJ8cknIXX/BRcoyB01AQCIa2XexlJdd2TiTk8AAABl5545M2ydXTQAAMQ/zjUCAACIF8GgUmfMCCmbLpd8V19tQUMAAKAqVSqkufLKK3XllVfqhRdeKNPx1113nXr37l2ZlwQAAEhaNT//XPYdO0Lq/h49ZNaubUFHAACgKpX5mjThrF69WoZhaM2aNfrhhx/07LPPyuGIPOW6deu0Z8+eyrwkAABA0qr77rth615OdQIAICFU+nQnh8Mhm82myZMnq2/fvsrLy6uCtgAAAHCUw4dVZ+nSkHKwbl35u3a1oCEAAFDVKh3S1KlTR1OnTlVaWppWr16tyy67TJs3b66K3gAAAPCblMWLZS8oCKn7+vaVXC4LOgIAAFWtSi4c3LVrV7377rtq1KiR/vvf/6pLly5as2ZNVUwNAAAASanTp4et+wYNinInAACgulTZ3Z3OOussLV26VK1atdK+ffvUt29fTZ48uaqmBwAASFrGrl1yffBBSD1w6qkK/P730W8IAABUiyq9BXfDhg317rvvqmfPnvJ6vbrtttv08MMPV+VLAAAAJB3njBkygsGQum/gQMkwLOgIAABUhyoNaSQpNTVVb731lm655RaZpqnnn39e119/vQ4fPlzVLwUAAJAUXFOnhtRMw5C3f38LugEAANWlykMaSTIMQ4899pieeeYZ2e12vfPOO+rZsydBDQAAQDnZvv5a9q+/DqkHLr5YZpMmFnQEAACqS7WENMVuuOEGTZs2TTVr1tSXX36p/Pz86nw5AACAhBNuF40keQcOjHInAACgulUqpGncuLFOPPHEUo/p3LmzFi9efNzj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p6ioSEajUf/88488PDw0ZMiQx36TC+tITk5WcXGxWrZsqd69e2vIkCEmJ26lB9cF6cE14GEjR47U559/riNHjuitt96yVJdhYVXxbc64S8S5LXhc/EmmJd8sNb/Dup4kli9evKhvvvlGd+/eVefOnTVixAizb3lF4ygpKdHmzZt17do1ubm5acCAAdUrbExBnNu/uLg4SdK0adPMOo84b5pI0jQBt2/fVl5ennx9feuc/KvemJuy8VhVne7du9d5vEePHjp16pRycnK4N9ZKKisrtWnTJklSZGSk2eefOnVK8+bNq/7dYDBo4sSJWrNmjZycnCzWTzy9hQsX1vjd29tb3333nfr27WvS+VXxXNeHc3OuC7CO8vJybdmyRQaDQcOHDzfrXOLc+uqLPzc3N7Vt2/ax8WfJ+R3Wk5ubq19//VXt27eXn5+fyedt3769xibTzz33nKKiomrENmzD9evXNXv27BplISEhio2NfewHbuLc/l2+fFlpaWnq1KmTQkJCzDqXOG+auN2pCajaVNjV1bXO461bt65Rz5S2Ht6s9EnaQsM4fPiwsrOz9eKLL6pnz55mnTt37lylpqYqJydHOTk5SkpKUkBAgLZt26a5c+c2UI9hrsDAQBmNRv3555/Ky8vT8ePHNWvWLGVnZyssLEzXrl0zqZ36rg3Ozs5q1qwZsWzDvvjiC2VlZemNN96Qr6+vyecR57bBlLn5cfFnyfkd1lFaWqqZM2fq/v37io6ONmkljYeHh5YuXarjx4/r6tWrOn36tDZs2CB3d3d9+umn+uGHHxqh5zDVm2++qd27d+vChQvKzc1VSkqKXnrpJaWkpGjKlCmqrKx/e1Di3P7Fx8eroqJCU6dONXm1HHHetLGSxoq6d++uGzdumFx/165dCgoKasAewVos+b9QtZzySTZvXrp0aY3fhw4dqp07d2rIkCH66aeftGDBAvXq1cvsdlHb04z5w2Pbs2dPxcTEyMnJSStXrtS6detqjSWsz5JxvnHjRq1atUp9+vTRl19+aVY/iHPANlRUVOj9999Xenq6pk+froiICJPO69WrV40YdXJy0qRJk9S7d28NHz5cMTExmj59Ok/atBEPP+knICBAW7du1ejRo5WRkaHk5GSNGjXKSr1DQ6uoqFB8fLwMBoNZ782J86aNJI0VhYeHq7i42OT67du3f6K/U5V5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",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nums = np.arange(-10, 10, step=1)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12,8))\n",
    "ax.plot(nums, sigmoid(nums), 'r')\n",
    "ax.set_xlabel('z', fontsize=18)\n",
    "ax.set_ylabel('g(z)', fontsize=18)\n",
    "ax.set_title('sigmoid function', fontsize=18)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "apEHwiQmvoH_"
   },
   "source": [
    "## Cost Function 代价函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Zw3ZmdqVjlII"
   },
   "source": [
    "棒极了！现在，我们需要编写代价函数来评估结果。\n",
    "代价函数：\n",
    "$J\\left( \\theta  \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "R0Y4hVpkjlIJ"
   },
   "outputs": [],
   "source": [
    "def cost(theta, X, y):\n",
    "    return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "XEBSMFxujlIS"
   },
   "source": [
    "让我们来检查矩阵的维度来确保一切良好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "6Ax8oM2AjlIT"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0.])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta = np.zeros(3)\n",
    "theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8OY_-JQ8jlIX"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 3), (3,), (100,))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape, theta.shape, y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ZZxmEmkwjlIa"
   },
   "source": [
    "让我们计算初始化参数的代价函数(theta为0)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "fXdMxsdrjlIb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599453"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "SSGkYiVXjlIf"
   },
   "source": [
    "看起来不错，接下来，我们需要一个函数来计算我们的训练数据、标签和一些参数thata的梯度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "tI-AX8knjlIi"
   },
   "source": [
    "## Gradient descent 梯度下降\n",
    "* 这是批量梯度下降（batch gradient descent）  \n",
    "* 转化为向量化计算： $\\frac{1}{m} X^T( Sigmoid(X\\theta) - y )$\n",
    "$$\\frac{\\partial J\\left( \\theta  \\right)}{\\partial {{\\theta }_{j}}}=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{\\left({h_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}\\right)x_{_{j}}^{(i)}}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "D1SA0lHXjlIj"
   },
   "outputs": [],
   "source": [
    "# Gradient的实现，利用的是循环的方法\n",
    "def gradient(theta, X, y):\n",
    "    theta = np.matrix(theta)\n",
    "    X = np.matrix(X)\n",
    "    y = np.matrix(y).T\n",
    "    print(\"X.shape = \", X.shape)\n",
    "    print(\"y.shape = \", y.shape)\n",
    "    print(\"theta.shape = \", theta.shape)\n",
    "    \n",
    "    parameters = int(theta.ravel().shape[1])\n",
    "    grad = np.zeros(parameters)\n",
    "    \n",
    "    error = sigmoid(X @ theta.T) - y\n",
    "    print(\"error.shape = \", error.shape)\n",
    "    \n",
    "    for i in range(parameters):\n",
    "        term = X[:,i].T @ error\n",
    "        grad[i] = term / len(X)\n",
    "    \n",
    "    return grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "brjL4gt34jMb"
   },
   "outputs": [],
   "source": [
    "# 另外一种实现的方法\n",
    "def gradient(theta, X, y):\n",
    "    return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "6TEJDxaqjlIr"
   },
   "source": [
    "注意，我们实际上没有在这个函数中执行梯度下降，我们仅仅在计算一个梯度步长。在练习中，一个称为“fminunc”的Octave函数是用来优化函数来计算成本和梯度参数。由于我们使用Python，我们可以用SciPy的“optimize”命名空间来做同样的事情。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "FoLQqZg7jlIt"
   },
   "source": [
    "我们看看用我们的数据和初始参数为0的梯度下降法的结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "twQhHqydjlIw"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -0.1       , -12.00921659, -11.26284221])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "M5cP5VjE-YdI"
   },
   "source": [
    "## 拟合参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3ye-zhoBjlI1"
   },
   "source": [
    "现在可以用SciPy's truncated newton（TNC）实现寻找最优参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "0UHRpG7ijlI2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " message: Optimization terminated successfully.\n",
      " success: True\n",
      "  status: 0\n",
      "     fun: 0.20349770531788094\n",
      "       x: [-2.516e+01  2.062e-01  2.014e-01]\n",
      "     nit: 29\n",
      "     jac: [ 3.010e-06  1.339e-06  1.866e-04]\n",
      "    nfev: 73\n",
      "    njev: 198\n",
      "    nhev: 0\n"
     ]
    }
   ],
   "source": [
    "import scipy.optimize as opt\n",
    "res = opt.minimize(fun=cost, x0=theta, args=(X, y), method='Newton-CG', jac=gradient)\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "o-z0iOvZjlI5"
   },
   "source": [
    "让我们看看在这个结论下代价函数计算结果是什么个样子~"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "d7Sc0NlzjlI6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.20349770531788094"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cost(res.x, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "jqbJJue1-lK6"
   },
   "source": [
    "## 用训练集预测和验证"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "F5xbkpoXjlJD"
   },
   "source": [
    "接下来，我们需要编写一个函数，用我们所学的参数theta来为数据集X输出预测。然后，我们可以使用这个函数来给我们的分类器的训练精度打分。\n",
    "逻辑回归模型的假设函数： \n",
    "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] \n",
    "当${{h}_{\\theta }}$大于等于0.5时，预测 y=1\n",
    "\n",
    "当${{h}_{\\theta }}$小于0.5时，预测 y=0 。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "L5kMfIWijlJE"
   },
   "outputs": [],
   "source": [
    "def predict(theta, X):\n",
    "    probability = sigmoid(X @ theta)\n",
    "    return [1 if x >= 0.5 else 0 for x in probability]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "5yDGG6aXjlJI"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy = 89%\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.87      0.85      0.86        40\n",
      "           1       0.90      0.92      0.91        60\n",
      "\n",
      "    accuracy                           0.89       100\n",
      "   macro avg       0.89      0.88      0.88       100\n",
      "weighted avg       0.89      0.89      0.89       100\n",
      "\n"
     ]
    }
   ],
   "source": [
    "theta_min = res.x\n",
    "predictions = predict(theta_min, X)\n",
    "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]\n",
    "accuracy = (sum(map(int, correct)) % len(correct))\n",
    "print ('accuracy = {0}%'.format(accuracy))\n",
    "print(classification_report(y, predictions))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "luDLSnm3jlJL"
   },
   "source": [
    "我们的逻辑回归分类器预测正确，如果一个学生被录取或没有录取，达到89%的精确度。不坏！记住，这是训练集的准确性。我们没有保持住了设置或使用交叉验证得到的真实逼近，所以这个数字有可能高于其真实值（这个话题将在以后说明）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "EO1hfP0j-0cc"
   },
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "xIvApW8HjBZg"
   },
   "source": [
    "## 寻找决策边界\n",
    "决策便捷是一系列的$x$可以满足：$$\\frac{1}{1+e^{-\\theta^T x}}=0.5$$\n",
    "也就是说$$e^{-\\theta^T x} = 1$$\n",
    "意味着 $$\\theta^T X = 0$$\n",
    "\n",
    "这是一条直线。\n",
    "\n",
    "参考这里：http://stats.stackexchange.com/questions/93569/why-is-logistic-regression-a-linear-classifier\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "oErM-l5djBZh"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-25.15632676   0.20619166   0.20143109]\n"
     ]
    }
   ],
   "source": [
    "print(res.x) # this is final theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Bmtqg98tjBZk"
   },
   "outputs": [],
   "source": [
    "# x0 = 1\n",
    "# 定义x1的range后，根据 θ0 + x1*θ1 + x2*θ2 = 0，可得x2\n",
    "x1 = np.arange(130, step=0.1)\n",
    "\n",
    "coef = -(res.x / res.x[2])  # find the equation\n",
    "x2 = coef[0] + coef[1]*x1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zW-rRiS-jBZu"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArUAAAJQCAYAAACQKZxwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACXi0lEQVR4nOzdd3hUZeL28e+U9EZC750gvQYBBQQFpXdIIAnI2te2a1tX3XV1Lauuq6uuurrChB46SJUinVAF6VJCC4SSkITUmcz7B2/mRySJQMpJuT/XxbUy5zkz9yRsuHnmOc8xOZ1OJyIiIiIiZZjZ6AAiIiIiIoWlUisiIiIiZZ5KrYiIiIiUeSq1IiIiIlLmqdSKiIiISJmnUisiIiIiZZ5KrYiIiIiUeSq1IiIiIlLmqdSKiIiISJlnNTqAiMCZM2fo06dPnscsFgseHh5UrVqVFi1aMHjwYHr37l3CCW/Wu3dvzp49y9tvv82oUaPu+HnCw8OJiYnh8ccf5/nnny/ChEWjoO+NyWQiICCAmjVr0qNHDyZMmEBQUFAJJyw5pf17JSIVm0qtSCnTrFkzfH19Xb/Pzs4mOTmZ06dPExsby7Jly7jnnnv417/+hZ+fn4FJK55ff28cDgdXr17l6NGjHDx4kNmzZzNlyhSCg4MNTCkiUjGp1IqUMq+99hpdunS56fHMzEwWLlzIu+++y8aNG3nyySf59ttvcXd3NyAlTJ48maysLKpVq1ao53n//fdJS0sjMDCwiJIVn/y+NwkJCbzyyiusW7eOZ555hmXLlmE2a3WXiEhJ0k9dkTLC3d2dUaNG8dVXX2GxWIiJiWHKlCmG5alXrx6NGzcu9GxxrVq1aNy4cZn+2D4wMJD33nsPd3d3Tp48ycaNG42OJCJS4ajUipQxnTt3ZsyYMQB88803pKenG5xI4Hqxbdq0KQBHjx41OI2ISMWjUitSBuWU2sTERHbs2HHT8ZSUFD7//HOGDh1K+/btadeuHYMGDeLTTz8lKSkp3+e9ePEin3zyCYMGDXKdN2zYML755hsyMzNzje3duzfBwcFER0fnevzq1at8/PHHDB8+nJCQENq2bcsDDzzAn//8Zw4fPnzTa4aHhxMcHMzHH39807H09HQmT57M6NGj6dChA61bt+b+++/njTfe4OTJkzeN37ZtG8HBwYwePZqsrCz+97//MXjwYNq2bUunTp2IjIzkhx9+yPf9F5bdbgfAx8cnz+P79u3jxRdfpFevXrRq1YqQkBDCw8OZM2cODofjpvEFfW0A/v3vfxMcHEx4eHiux3O+N8eOHSMmJoZHH32ULl260Lp1ax566CE+/fRTrl27ludzJiUl8dlnnzFgwADatWvHPffcw2uvvcbFixcLfO/x8fF8/PHHjBw5kpCQEFq2bElISAhjx47lf//7303/+Dpz5gzBwcF0796dCxcu8Oijj9KmTRtCQkL44x//yJgxYwgODubtt9/O9zW/+OILgoOD+d3vfldgNhGpGLSmVqQMat68Ob6+vqSkpBATE8M999zjOnbs2DEeeeQRzp49i8VioW7dunh6evLLL7/w+eefs2DBAv773//SuHHjXM+5c+dOnn76aS5fvozVaqVx48ZkZmZy8OBBDhw4wI8//viba3gTExMZPXo0sbGxuLu7U69ePdzc3IiNjWXOnDksXLiQL774gh49evzmezx//jwTJ07k+PHjADRo0AAfHx+OHTvGrFmzWLBgAe+99x79+/e/6dysrCweeeQRtmzZQmBgII0bN+bEiRNs3bqVrVu38te//pXQ0NBb/XLfklOnTnH06FHMZjP33nvvTcf/+9//8s9//pPs7Gx8fX0JDg4mISGBmJgYYmJiXF+borz4Lzo6msmTJ+Pu7k6DBg24evUqx48f5/PPP2fz5s1MmzYNi8XiGn/u3DkmTZrE8ePHsVgsNG3alIyMDKKjo/nxxx/x9vbO83X27NnDI488QlJSEh4eHtSrVw+r1cqZM2fYvXs3u3fvZvXq1dhstlyvB9fXik+aNImTJ0/StGlTzp07R+3atenSpQt79uzh+++/55VXXsFqvfmvq4ULFwIwfPjwIvuaiUjZpZlakTKqdu3awPUikiM1NZUnnniCs2fP0qdPH9auXcuKFStYuHAh69ato1evXpw9e5Ynn3wy18zZ1atXefbZZ7l8+TI9evRg3bp1LFq0iOXLlxMdHU1QUBAxMTF8/vnnBWb65ptviI2NpUOHDvz44498//33LFiwgPXr19O3b1+ysrJ45513fvO9ORwOHn/8cY4fP07Dhg1ZuHAhK1asYN68eWzatIlRo0aRkZHBSy+9xE8//XTT+QcOHOCnn37iww8/ZOvWrcybN4/169fTtWtXAP71r3+5ZlULw+FwkJCQ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EJYzOztnzpw8Z9XsdjtPPvkkI0eO5P3333c93rNnTwAWL16cZ4Fav349u3btYsOGDVSuXDnPXHa7naFDhxIZGem66OhGVapUca3XLGgHhRvfx5o1a/It0TabDYB27drlWldspB9//BG4Xm5z1vw2bNjQVRjzu63xrl272Lt3L0CuPXxzLry6cf1zjmvXrrFly5Yiy963b1/g+p6zBw4cuOn4oUOHXBlvdOMyGC8vr5uOb9q0ybXt3J2sYwYYOXIkAKtWrXKtFdcFYiLyayq1ImXEtWvXmDZtGo899hjZ2dl07dr1phsIjBs3jqpVqxIbG8sTTzyRaw/bK1eu8Nxzz3Hs2DHc3Nx4+OGHXcfCwsKoVKkSsbGxvPDCC7m2Cdu7dy9/+ctfAAgNDc13zaXVamXAgAEA/P3vf7+pAK1cuZKNGzcC/ObNFx588EGCg4PJyMjgkUcecW0VBtc/Hn/99dfZuHEjVquVF154ocDnKglOp5OVK1fy5ZdfAtd3i6hZs6br+LPPPgtc3zrt008/zfUPh23btvHMM88AcO+999KtWzfXsZxdATZs2MDKlStdj8fHx/PMM89w+fLlInsPwcHBDBw4EKfTye9///tcM7ZHjx7lmWeeyXMdck5h37RpU67tyOx2O0uWLOH55593PXant3Tu3bs3gYGB7Ny5k02bNlGlShXXP8RERHJoTa1IKfP222/nuqjIbreTlJTE6dOnXTNdvXv35oMPPrjpLksBAQH85z//4YknnmDz5s306dOHJk2aYDKZOHHiBJmZmVitVv75z3+69iqF6+tgP/vsM5588klWrFjB2rVradq0KUlJSZw5cwan08k999zjKmf5ef7559m5cycHDhxg1KhR1K5dm8DAQOLj410flYeGhv5mqbVarXzxxRc88sgjHD9+nCFDhuS6o1h6ejqenp68+eabdOrU6ba+voXx6+8NXP/+nD171lUwW7Zs6dr5IMdDDz3EqVOn+Pjjj/n888+ZMmUKDRs25MqVK66ZzpCQED744INcSxiGDRvG1KlTOXHiBE8//TT16tXD29ubY8eOYbFYePzxx11Fuij85S9/4dy5c+zatYuhQ4fStGlTTCYTR48exd/fn5CQkJsuBnv44YdZsmQJCQkJjBs3zvV9OnPmDFevXsXb25v27duze/duzp8/f0e53N3dGTRoEDabDYfDwbhx4/K8w5iIVGz6qSBSyvx6g3qz2YyXlxeNGjWidevWDB482HVnrLy0bt2axYsXExUVxZo1a4iNjSUrK4uqVasSEhLCxIkT89y6q3PnzixZsoRvv/2WH3/8kV9++QWLxUKbNm0YMWIEo0aNKnCPWrh+kVNUVBRTpkxh9erVnDx5kgsXLhAYGEifPn0YPXo0vXr1uqWvQ506dZg7dy4zZsxg+fLlHDt2jPPnz1OzZk3uvfdeV4EqSXndPMDDw4OgoCDuu+8++vbty+DBg/MsXI899hhdu3ZlypQp7Nixg0OHDuHv70/Xrl0ZOnQogwcPvunr6+Pjw6xZs/jqq6/44YcfOHfuHAEBAfTr14+nnnqK8+fPF2mp9ff3Z8qUKcyYMYP58+e7bnfcr18//vCHP/D111/fVGpr1arFokWL+OKLL9iyZQtxcXFYLBZq1qzJ4MGDiYyM5OzZs0RGRrJt2zZSU1PvaJeN4cOHu5acaOmBiOTF5CzKfW1ERESKwZo1a3jiiSdo3bo1c+bMMTqOiJRCWlMrIiKl3uzZswEYPXq0wUlEpLTS8gMRESl1HA4Hhw4dIiAggPnz57N27VoqV66svWlFJF8qtSIiUuqYzWbGjh2ba6eIP/3pTwXefUxEKjYtPxARkVLHZDLRpUsXvLy8qF+/Pn//+98ZNGiQ0bFEpBTThWIiIiIiUuZpplZEREREyjyV2hIwfvx4xo8fb3QMERERkXJLF4qVgLi4OKMjiIiIiJRrmqkVERERkTJPpVZEREREyjyVWhEREREp81RqRURERKTMU6kVERERkTJPpVZEREREyjyVWhEREREp81RqRURERKTMU6kVERERkTJPpVZEREREyjyVWhEREREp81RqRURERKTMU6kVERERkTJPpVZEREREyjyVWhEREREp81RqRURERKTMU6kVERERkTJPpbaEJCcnk5KSYnQMERERkXJJpbaE2O12oqKiSE1NNTqKiIiISLmjUltCzGYz8fHxREVFkZ6ebnQcERERkXJFpbaE+Pr64u3tzfnz55k6dSoZGRlGRxIREREpN1RqS4jFYiEiIgIvLy/Onj3L9OnTyczMNDqWiIiISLmgUluCqlevzvjx4/Hw8ODUqVPMnDmTrKwso2OJiIiIlHkqtSWsVq1ajBs3Dnd3d06cOMHs2bOx2+1GxxIREREp01RqDVC3bl3CwsKwWq388ssvzJkzB4fDYXQsERERkTJLpdYg9evXJzQ0FIvFwuHDh5k3bx7Z2dlGxxIREREpk1RqDdSoUSPGjBmD2WzmwIEDLFy4UMVWRERE5A6o1BqsadOmjBo1CpPJxN69e1myZAlOp9PoWCIiIiJlikptKdC8eXOGDx+OyWRi9+7dLFu2TMVWRERE5DaUyVJ78uRJ2rVrx9/+9rc8j6elpfHFF18wZMgQ2rVrR5s2bXjooYf48MMPSUxMzPMcu93OrFmzGD58OB06dCAkJIRJkyaxbdu2Ynwn/6dVq1YMGTIEgO3bt7Ny5UoVWxEREZFbZDU6wO26dOkSTz75JGlpaXkeT0xMJDw8nCNHjuDn50f79u2xWCzs27eP//73vyxdupTp06dTo0YN1zlOp5OXX36ZJUuWEBAQQLdu3UhMTGTz5s1s2rSJv//974wYMaLY31vbtm2x2+0sWbKErVu34ubmRu/evYv9dUVERETKujJVag8ePMizzz5LbGxsvmM++OADjhw5QkhICJ988glBQUEAJCUl8Yc//IENGzbw+uuv89///td1zty5c1myZAl33XUXkydPplKlSgBs2bKFxx57jDfffJNu3bpRs2bNYn1/AB07dsThcLBs2TI2bNiA1WqlR48exf66IiIiImVZmVh+cPXqVT744ANGjx5NbGwsderUyXNceno6S5YsAeC9995zFVoAf39/3n//fUwmExs2bCAhIcF17KuvvgLgtddecxVagK5duxIZGUlGRgZRUVHF8M7yFhISwgMPPADA2rVr2bx5c4m9toiIiEhZVCZKrc1m45tvviEoKIj//Oc/DB06NM9xly9fpmXLlnTo0IHatWvfdLxy5coEBATgdDqJj48H4JdffuHUqVNUrlyZjh073nROv379AFi9enXRvaFb0K1bN+677z4AVq1aRUxMTIm+voiIiEhZUiaWH9SoUYOXX36ZsLAwPD092b9/f57jateuzfTp0/N9ntjYWBITEzGbzVSvXh2AI0eOANe31jKZTDedk/P4qVOnSEtLw8vLqwje0a3p0aMHdrudDRs2sGzZMiwWS57FW0RERKSiKxOldtSoUUXyPB9++CFwfRY0Z5lBzoxtTsn9NQ8PD/z9/bl69SqXLl2ibt26eY7r06dPvq8bFxd3x+tx77vvPux2O1u2bGHJkiVYrVba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axcNGza0/vfOnTv58MMPOXToEDk5ObRt25aRI0cSGBiIyWQq75DtVr9+/UhLS7thux49erBs2TJA4/t/kZKSwpAhQxg6dGipfXirYzk/P59169axevVqUlJScHR0pHPnzoSEhODn51feh1Sl3ai/s7Oz+fjjj4mOjubYsWMUFhbSvHlzAgICePLJJ6lfv36JbZ5//vnrju+goKDrfj/k9qOktpzs37+f0aNHk5WVRZcuXejcuTM//PADCxYsYOvWraxYsULLhN0iwzCYOHEikZGR1j8WDRs25NChQ6xfv55NmzYxb9487r77bus2v/zyCwB+fn40bty4xD6bNm1aYfHbo4SEBADat29Phw4dbLapUaOG9d9XrlzJ66+/jpOTE35+fjg5ObF7925eeeUVfvjhB6ZPn14hcduj/v378/vvv9usMwyDTZs2kZ+fj4+Pj7Vc47tszp07x1NPPUV2dnapbW51LBuGwQsvvEBkZCT16tWjd+/epKens3PnTnbs2MGbb77JsGHDyvvQqqQb9Xd6ejqPPfYYhw8fpk6dOvj6+uLg4MCBAwf48MMP2bhxIytWrKBJkybFtrOM/8GDB1OtWskbz126dPnzD0aqNkP+dHl5eUZAQIBhNpuNtWvXWsuzs7ONsWPHGmaz2XjjjTcqMUL7tH79esNsNht9+vQxDh48aC3Pz883wsPDDbPZbPTq1cu4dOmStW7o0KGG2Ww2jh49Whkh270ZM2YYZrPZWLVq1Q3bHj161OjQoYPRrVs345dffrGWp6WlGf379zfMZrPx1VdflWe4t625c+caZrPZCAoKMvLy8qzlGt+3LiEhwRgwYIBhNptL/S0uy1heu3atYTabjYceesi4cOGCtXznzp1G586djc6dOxsnT54st+Oqqm6mv19++WXDbDYbjz76qHH+/HlreUZGhjFmzBjDbDYbTz75ZLFtLl26ZHh7ext9+vQp92MQ+6E5teUgKiqK1NRUevXqRWBgoLXc2dmZsLAwXFxcWLNmDRkZGZUYpf359NNPgaJbTt7e3tZyBwcHnn32WTw9PTl//jw7duwAIC8vz3rm7+HhURkh2z3LldrOnTvfsO2iRYsoKChgzJgxdOzY0VrerFkz6y3ARYsWlU+gt7HY2Fjmzp1L3bp1mT17No6ORTfYNL5vTUZGBm+//TYjRozg2LFjtGjRotS2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IiIiYuc02URERERE7J6SWhERERGxe0pqRURERMTuKakVEREREbunpFZERERE7J6SWhERERGxe0pqRURERMTuKakVEREREbunpFZEpIqKiYnBy8uLOXPmVHYoIiJVnpJaEZEqKDU1lZdffrmywxARsRtKakVEqpjExESCg4M5c+ZMZYciImI3lNSKiFQRBQUFLF++nBEjRnDy5MnKDkdExK44VnYAIiICGRkZPPLIIyQlJQEQFBTEwYMH+eGHHyo5MhER+6ArtSJSZZ07d4633nqL+++/n65du+Lr68uwYcNYvHgxV65csbaLjY2lQ4cOeHl58f7775fYz5EjR+jatSteXl4sWLCgWN2ZM2eYM2cOgYGB9OjRAx8fH3r06MHIkSNZvHgxOTk5xdqfOHECLy8v7rnnHgoLC1m+fDlDhgyha9eu9OzZk3HjxnHkyBEAfv/9d6ZNm0bfvn3p1KkT/v7+TJ06lczMzBIxZmZmkpSURLt27Vi8eDGvvvoqjo667iAicrNMhmEYlR2EiMgf7du3j6eeeor09HScnJzw8PDAMAyOHDmCYRh4e3uzaNEiGjVqBMDMmTNZvHgxTk5OrF+/nvbt2wOQm5vLiBEjOHjwID179uTjjz+mWrWi8/kff/yRf/7zn1y8eJEaNWrQqlUrHB0dOXHihDXxvOuuu4iIiMDBwQEoSmoDAgJo1KgRvr6+bN68GXd3d+rXr8/Ro0fJy8ujXr16LFy4kPHjx3P27Flat25NYWEhx44dA8DX15eVK1diMpmsx3vhwgV27NjBoEGDrJ/12GOPERcXx9ixY5kwYULFdLyIiJ3SlVoRqXJOnz5tTWhHjBjBzp07iYyMJCoqis2bN9O1a1cOHTrEs88+a91mwoQJeHt7k5eXx8svv0xBQQEA4eHhHDx4kIYNG/L2229bE9qCggImTZrExYsX6d+/PzExMURGRrJ+/Xp27drF888/D8DevXuJiYkpEePZs2f59ttvmTFjBtu2bWPDhg189tln1KxZ0zqVwNXVla+++opNmzaxefNmwsLCAIiPj2fPnj3F9tegQQP+/ve/WxNaERG5NUpqRaTK+eijj0hPT6dfv35MmzaNunXrWutatWrF/PnzqV27Nnv37mXbtm0AVK9enVmzZlGjRg1++uknli1bxq5du1iyZAkmk4np06fTuHFj634OHTpEeno61atX5z//+Q/16tWz1jk5ORESEkLLli0BOHz4sM04AwMDefjhh61XXM1mMwEBAQAYhsG7776Lh4eHtf2wYcNo3rw5AAkJCX9CT4mIiIWSWhGpcr755hsAHnzwQZv1bm5u9OnTB4CtW7dayz09Pa1XWN977z1eeOEFDMMgODiYvn37FtuHj48Pe/bsYc+ePTRo0KDEZ+Tm5loT3ezsbJtx/HGfgDVpbdOmDa1atSpRb0msL126ZHOfIiJSNnoKQUSqlMuXL5OWlgbA/PnziYiIsNnO0ubo0aPFyoODg/n+++/Zvn07ly9fxsfHh4kTJ5b6ec7OzqSkpPDzzz9z/PhxUlNTSUpKIjEx0fowWmFhoc1tmzZtWqLMyckJgIYNG9rcxlKvxxlERP5cSmpFpEq59gpmabf9r/XHlQRMJhP33nsv27dvB4qumFavXt3mtj/99BOzZs0iLi6uWHmDBg3w9/cnISGBEydOlPrZNWvWLLXOMndXREQqhpJaEalSrk0Uv/zyS8xm8y1tn5qaSnh4OFCUWEZGRtK/f38GDRpUrN2RI0cIDg4mJyeH9u3bM2zYMLy9vWnXrh3u7u4AjBw58rpJrYiIVB1KakWkSqlbty5ubm6cO3eOpKSkUpPaxMRECgsLadasmXXuq2VFg8uXL+Pv789dd93F7Nmzef311+nWrZs1WQVYunQpOTk5tG3blk8//dTmVdfTp0+Xz0GKiMifTvfHRKTKsTyA9cknn9icz5qZmcno0aMZMmQIS5cutZYvXLiQ+Ph46tSpw7Rp0xgzZgw+Pj6kp6fz4osvFpvHapmT265dO5sJ7Y4dO6yvqrUsDyYiIlWXkloRqXJCQkJwcXFh3759TJo0id9//91al5aWRkhICBcuXKBOnToEBQUBcODAAebPnw/ASy+9hLu7Ow4ODkyfPh0nJyd27txZ7KGzNm3aAEXJ6969e63l+fn5REZGFnvZwR/fKiYiIlWPph+ISJXTunVr3nnnHSZMmEBkZCTR0dG0b9+evLw8UlJSyM/Px8XFhQ8++ABXV1eys7OZNGkSeXl53HPPPQwbNsy6Ly8vL8aOHct///tfZs+eTe/evfH09OSJJ54gMjKSCxcuEBQUhIeHB7Vq1eLEiRNkZGTg4uKCr68v8fHx/Pbbb5XYGyIicjN0pVZEqiR/f3+ioqJ4/PHHadWqFcnJyRw7dozmzZvzyCOPsGHDBrp16wYUvSI3OTnZOu3gj0JDQ+nQoQNXrlxh0qRJ5Obm0qxZMzZs2MCoUaPw8PDg1KlTJCcn4+bmxmOPPcaGDRusbyyLjY0lKyurIg9fRERukcnQYokiIiIiYud0pVZERERE7J6SWhERERGxe0pqRURERMTuKakVEREREbunpFZERERE7J6SWhERERGxe0pqRURERMTuKakVEREREbunpFZERERE7J6SWhERERGxe0pqRURERMTuKakVEREREbunpFZERERE7J6SWhERERGxe/8HAdENT2Own1IAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 718.125x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "data = {\n",
    "    'exam1': [85, 90, 78, 92, 88],\n",
    "    'exam2': [78, 85, 80, 88, 85],\n",
    "    'admitted': ['yes', 'yes', 'no', 'yes', 'no']\n",
    "}\n",
    "\n",
    "# 创建 DataFrame\n",
    "df = pd.DataFrame(data)\n",
    "\n",
    "# 然后再调用 sns.lmplot\n",
    "sns.lmplot(x='exam1', y='exam2', hue='admitted', data=df, \n",
    "           height=6,  # 设置图形的大小\n",
    "           fit_reg=False,  # 不绘制回归线\n",
    "           scatter_kws={\"s\": 25})  # 设置散点的大小\n",
    "\n",
    "# 画出决策边界（假设 x1 和 x2 已经定义）\n",
    "plt.plot(x1, x2, 'grey')\n",
    "\n",
    "# 设置坐标轴范围\n",
    "plt.xlim(0, 130)\n",
    "plt.ylim(0, 130)\n",
    "\n",
    "# 设置标题\n",
    "plt.title('Decision Boundary')\n",
    "\n",
    "# 显示图形\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "qgr6k1ybjlJM"
   },
   "source": [
    "## 正则化逻辑回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "raPYPfoXjlJN"
   },
   "source": [
    "在训练的第二部分，我们将要通过加入正则项提升逻辑回归算法。如果你对正则化有点眼生，或者喜欢这一节的方程的背景，请参考在\"exercises\"文件夹中的\"ex2.pdf\"。简而言之，正则化是成本函数中的一个术语，它使算法更倾向于“更简单”的模型（在这种情况下，模型将更小的系数）。这个理论助于减少过拟合，提高模型的泛化能力。这样，我们开始吧。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8HRDKZsYjlJO"
   },
   "source": [
    "设想你是工厂的生产主管，你有一些芯片在两次测试中的测试结果。对于这两次测试，你想决定是否芯片要被接受或抛弃。为了帮助你做出艰难的决定，你拥有过去芯片的测试数据集，从其中你可以构建一个逻辑回归模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "JuiBlOvjjlJR"
   },
   "source": [
    "和第一部分很像，从数据可视化开始吧！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "PPewmmIgjlJS"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>test1</th>\n",
       "      <th>test2</th>\n",
       "      <th>accepted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      test1    test2  accepted\n",
       "0  0.051267  0.69956         1\n",
       "1 -0.092742  0.68494         1\n",
       "2 -0.213710  0.69225         1\n",
       "3 -0.375000  0.50219         1\n",
       "4 -0.513250  0.46564         1"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data2 = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n",
    "data2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "PH37JgMmjlJV"
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBkAAAK5CAYAAAD6s/YmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADSbUlEQVR4nOzde1xUdf7H8feAI4jmaoACmYZ4S9CyG96t3C62uVpqa3bd2qzMyLWLmi4mq5Vbay6rtmlt/rSMLlZkWe6G5j0v6aZgFiJFBejg3QgcYX5/0EwOM8AwDszt9Xw8fNScc+ac72FmYM7nfL6fj8FisVgEAAAAAABwlkK8PQAAAAAAABAYCDIAAAAAAACPIMgAAAAAAAA8giADAAAAAADwCIIMAAAAAADAIwgyAAAAAAAAjyDIAAAAAAAAPKKJtweA+rvssst06tQpRUdHe3soAAAAAIAgYDKZ1LRpU23fvr3W7Qgy+KHy8nJVVFR4exgAAAAAgCBx+vRpWSyWOrcjyOCH2rRpI0nKysry8kgAAAAAAMFg8ODBLm1HTQYAAAAAAOARBBkAAAAAAIBHEGQAAAAAAAAeQZABAAAAAAB4BEEGAAAAAADgEQQZAAAAAACARxBkAAAAAAAAHkGQAQAAAAAAeARBBgAAAAAA4BFNvD0AAAAAAPBnFotFZrNZlZWV3h4KUKfQ0FAZjcYG2z9BBgAAAABww6lTp3Tw4EGVlpaqoqLC28MBXBYWFqaoqCi1bNnS4/smyAAAAAAA9VRaWqrvv/9eoaGhat26tZo1a6bQ0FAZDAZvDw2okTXr5tixY/rxxx8lyeOBBoIMAAAAAFBPJSUlMhqN6tChg0JDQ709HMBlzZo10znnnKMffvhBJSUlHg8yUPgRAAAAAOrh9OnT+umnn3TuuecSYIBfMhgM+s1vfqPy8nKZzWaP7psgAwAAAADUw+nTpyVVzWsH/JW1+KOn64kQZAAAAAAAN1B/Af6sod6/BBkAAAAAAIBHEGQAAAAAAAAeQZABAAAAAAB4BEEGAAAAAAAakMVi8fYQGg1BBgAAvKSyjpZRda0HAMAfmc1m9e3bV127dtWwYcO8PZwGZTabtXjxYj399NMNepwffvhBXbt2Va9evRr0OK4gyAAAgBeY1m/UzpSJKjeVOF1fbirRzpSJMq3f2MgjAwCgYa1evVqHDh1SWFiY9u7dq+3bt3t7SA3mjTfe0DPPPKMTJ054eyiNhiADAACNrNJsVsGyDJUVFip7WqpDoKHcVKLsaakqKyxUwbIMMhoAAAHlrbfekiTde++9kqRly5Z5czgNqrKy0ttDaHQEGQAAaGQhRqOS0qYrPKatyooP2AUabAGG4gMKj2mrpLTpCjEavTxiAIAvKTdX6MiJMpWbK7w9lHr78ccftWnTJsXExOi+++5TixYt9J///Ecmk8nbQ4OHNPH2AAAACEZh0VFKmplmCyhkT0tV5wkpyp2b/muAYWaawqKjvD1UAICPyNl/SJnr8vR5dpEsFslgkHonxWr4oAR1j4/09vBc8s4776iyslI33HCDIiIiNGTIEL399tt68803NX78eKfPycvL0+LFi7Vx40aVlJQoOjpavXr10oMPPqiEhAS7bSsqKvT222/r/fffV15eniSpffv2GjVqlEaMGCFjtcD9Dz/8oIULF2rDhg06ePCgWrRooUsuuUT33XefQ32Df/7zn5o3b55mzpypmJgYzZs3T3v37rU954EHHlBiYqJt+6uvvlo//vijJOm9997Te++9p5tuuknPPvusbZuvv/5aixYt0pYtW3TkyBG1atVKycnJevDBB9WpUyeHn0VpaakWL16sFStW6Mcff1RkZKR+//vf6/e//309XoWGRSYDAABeYg00WDMadk+eSoABAODUyk35mjx/g7bmFMvaqMBikbbmFGvSvA36eFO+dwfogoqKCr377ruSpJtvvlmSNHLkSEnSm2++qdOnTzs859NPP9XNN9+st956SxEREbryyivVvHlzrVixQjfffLP+97//2bYtLy/XH//4R02fPl1ff/21Lr74Yl166aXKz8/X9OnT9eijj9pNX9iyZYuGDRumN998U6Ghobryyit1wQUXaPXq1RozZozefPNNp+eRlZWl++67T0VFRRo0aJCio6P1n//8R6NHj1ZWVpZtu9/+9re2oMP555+voUOH2gUuPvroI40YMUIrVqzQb37zG1111VVq06aNPvzwQ918881as2aN3XFPnjypO++8U//4xz90+PBhDRw4UO3atdOiRYv0yCOP1OelaFBkMgAA4EVh0VHqPCFFuydPtS3rPCGFAAMAwCZn/yG9uHyXJKmi0r4VovXxguW71CG2pU9nNKxfv17FxcW6+OKL1blzZ0nSxRdfrC5d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KiltusJj2qqs+IDdhZHtgqj4gMJj2iopbTop3vAKf8kO4PMEAP7DX/62eMKaNWskVV20Wx04cECjRo1Senq6SkpKlJycrF69eiknJ0eTJk3SpEmTXOro8M033+j3v/+9/v3vf+vnn39Wv379dOGFF2rr1q0aO3asXnjhBYfnvP7667r11lv14YcfKioqSldeeaUkKSMjQzfddJMKCgokSUOHDlXHjh0lVV0LDh061O4c/v3vf+v2229XVlaWYmJidPXVVys8PFxvvvmmbrrpJoeb0MXFxRo9erReeeUVlZWV6corr1SrVq00e/ZszZo1q34/1EYWsEGGUaNG6Z577lF4eLjb+zh48KAkqW3btk7Xt2nTxm67Y8eOqaysrF7PAVA/YdFRSpqZZndhdPyrvfYXRDPTFBYd5e2hIgj5W3YAnycA8H3+9relviwWi06ePKldu3bp0Ucf1YYNG9S0aVO77gyPP/649u/fr2HDhikrK0sLFy7UK6+8ov/85z/q2rWrMjMz9dprr9V6nNOnT+vhhx+WyWTSn/70J2VlZelf//qXlixZovfff18xMTH617/+ZctMl6Svv/5azzzzjEJDQ/XSSy9p+fLlSk9P18cff6w77rhDhw8f1lNPPSVJev75523T5a+99lo9//zztuz2rVu36m9/+5vOOeccLVmyRO+++65tP3/5y1909OhRPfzww7ZrSUmaOXOmvvvuO1133XX69NNPlZ6erjfffFPz5s1Tfn6+p378DSJggwyeUFpaKkk1VjW1BjCs21n/27RpU4fpFTU9pyaDBw+u8V9RUVH9TwYIINUvjHZPnsoFEXyCP2YH8HkCAN/mj39bavLjjz+qa9eudv+6deumSy+9VKNGjdKHH36o9u3ba+HChUpMTJQk7dq1S1u2bNF5552nv/71r4qIiLDtr23btpo5c6Yk6eWXX6712P/973/17bffqlevXnrsscfsuv116tRJkydPllRVvN/qjTfekNls1l133WXLYJCkkJAQPf7440pISFBFRYXKy8trPfbLL78si8WiRx99VFdccYXduttvv12DBg1ScXGxVqxYIakqc+PTTz9VRESEZs2apbCwMNv211xzjf7whz/UejxvI8hQi9DQUEmSwWCodTtrao41sFDX9mc+B4B7wqKj1HlCit2yzhNSuCCC1/ljdgCfJwDwbf74t8WZiIgIDR06VEOHDtWNN96ofv362a65LrroIi1btkyrVq1Snz59bM/5/PPPJUmXXXaZ3cW2Vc+ePXXuueequLi41jv8mzdvliT16dPH6fXawIEDFRISoi+//FI///yz3XOctd0MCwvTypUr9X//939Ox2VVUVGhrVu3SpL69evndJtBgwbZnevWrVtlsVh06aWX6pxzznHY/rrrrqvxeL4g4FtYno3mzZtLku1NVp01ncWa6WDdvry8XJWVlU6zGao/pya1VVN19iYHgk25qUS5c9PtluXOTfeLP7AIfNYvg9Yvf7snT5Ukn/0SyOcJAHyfv/1tccZZC8v8/Hzdd999+vLLL/Xqq6/qoosusruOshZFzMzMVGZmZq37LyoqUnx8fI3rJGnBggVasGBBrfs5ePCgOnToYJviHhcXV/uJ1eLo0aO268nf/va3tW5rPdcDBw5IkmJjY51u1759e7fH0xgIMtSiTZs2ysnJkclkcrre+qaz1llo0aKFWrRooZMnT8pkMjmty1D9OQDqr3pqYOcJKcqdm26L7PvLH1oENmt2gPVLoOSb2QF8ngDAf/jL35b6iI+P10svvaSRI0fqv//9r6ZPn25X2NDaSaFbt27q3Llzrftq2bJljeus+7nkkktsHSxqYp1Kcfr0aZfOoTbW4xoMBqfdLs5kHVddmfHW7A9fRZChFl27dtWaNWu0b98+p+uty8+sGtqlSxft2LFD+/btcxpkcPYcAK5zmHv4ywXQmZF9LozgC/whO4DPEwD4F3/42+KOhIQETZ48WampqXrnnXfUr18/3XDDDZJ+vTnbq1cvW5FFd1j3c/XVV+u+++5z6TnR0dH68ccfVVxc7PTa7tNPP9WpU6fUu3dvnXvuuU730apVKxmNRpnNZk2ZMkWRkZF1HteawfDDDz84XW/NdPBV1GSohXVuzH//+1+HXqRms9k2peGqq65yeM6qVasc9peXl6dvvvlG5557ri666KKGGjYQsCrNZmWnznA699BhrmLqDL+rrozAUf3ivcezs5wW7PImPk8A4F/84W/L2fjDH/5gq8Uwc+ZMHT16VJJshRI3bdqkU6dOOTzvwIEDGjJkiO666y7bc5yx7mft2rVO12dnZ+u6667TAw88YMtgsD7ns88+c9i+oqJCTz31lP785z+rpKTqZ+8sA8FoNKpXr16Sfm3PWd3zzz+vm2++WUuXLpUk9e7dW6Ghodq+fbtt32c6swOGLyLIoKqAQV5envLy8mQ+40vUJZdcoh49eigvL09z5syxFWusqKjQrFmzVFRUpIEDB+rCCy+0Pefmm29WixYttHz5cru6CkePHtWTTz4pSbrnnnvsqpkCcE2I0aj2Y0YrPC7OacTedmEUF6f2Y0b7dHXlQFJurtCRE2UqN1d4eyg+wVl2QMsLuzkU7PL2l0E+TwDgP/zlb8vZSktLU3h4uA4dOqTZs2dLqrrQ79Gjh7777jv95S9/0U8//WTb/uTJk3riiSe0f/9+hYaGqlWrVjXu+4YbblBsbKy2bdumv//973bXfQcPHtSUKVP07bffKjo6Wk2aVCX833777QoNDdWrr76qLVu22LavqKjQ3/72N5lMJvXq1UtdunSRJFsByGPHjtkd+95775UkPffcc3b7kapuaC9evFg5OTm2jhrnnnuuhg8frlOnTumxxx7TyZMnbdtv2bJF//73v137gXqJwRIkbQ7++c9/at68ebrtttuUmppqt+6HH36wFVPMyspSu3btbOtyc3N1++236+jRo+rYsaM6d+6sr776SgUFBTrvvPP0xhtvOKTOrFixQk888YQsFot69eqlyMhIbdu2TUePHtWAAQP04osvnlWQ4cyxAsGo0myu9YKnrvXwjJz9h5S5Lk+fZxfJYpEMBql3UqyGD0pQ9/i6UwEDUaXZrJ0pE1VWWOi0EJfdl8S4OPVKn+P19yqfJwCov7KyMuXn5ys+Pt7Wor6h+OPfluq2bNmiO++8U+edd16dd+EXLlyov//975KkxYsXq0+fPvr+++9111136ccff1SrVq2UlJSk0NBQ7dixQydOnFD79u312muv2a7LrMfr3LmzPvzwQ9u+d+3apfvuu09Hjx5VmzZt1L17d50+fVrbtm1TeXm5evbsqVdffVUtWrSwPWfp0qW2GhEXX3yx2rRpoz179uj7779XVFSUXnvtNVuxyXfeeUdTp05VWFiYBgwYoEGDBumWW26RJP3jH/+wFZzs3r272rVrp++//15fffWVJOnRRx/V2LFjbcc9fvy47rnnHu3evVutWrXSFVdcoaNHj2rbtm3q1auXduzY4XB+9VXf97Gr16FkMtShc+fOevfdd3XzzTfrxIkTthSXO+64Q2+99ZbTuTlDhw7V0qVLNWDAAO3b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QKMrN1foyIkylZsrvD0U1ICC5/BlBovF1e7sjjZv3qyHHnpIpaWlMjjpv2axWNS8eXOlp6erXz+iZ54yePBgSVJWVpaXR+Kbqhd57DwhRblz05kyAQAAUIuc/YeUuS5Pn2cXyWKpmrLXOylWwwclUBPIBzkruh4WHVXjcuBsuXod6nYmgyT16dNHH374oW655Ra1adNGFovF9i86Olq33HKL3n//fQIMaDTe7nABAADgj1Zuytfk+Ru0NadY1luQFou0NadYk+Zt0Meb8r07QDig4Dl81VllMlT3008/6eTJk2revLlatGjhqd2iGjIZnKs0m7UzZaLKCgud/lK1C0DExTVafQgAAABflrP/kCbP31DndrPH9yejwQed+R3XigADGkKjZDJI0okTJ/TWW29Jkpo3b662bduqRYsWevXVVzV//nyVlHjvjnF+fr4ee+wxXXXVVerZs6euvfZavfDCCyotLa33vj777DP96U9/Uu/evZWYmKh+/frp4Ycf1pdfful0+w0bNqhr1641/uvVq9fZnh6q8aUOFwAAAP4ic12eQ/vk6kJDDMpcm9dII0J9WAuen4mC5/Amt7tLSNL69es1YcIElZaWatCgQWrbtq1t3bp16/T555/r//7v/zRnzhz179//rAdbH7t27dJdd92l0tJS9ezZUz169NCOHTv0r3/9S2vWrNGyZctczraYM2eOXnrpJRkMBiUmJiomJkb79+/Xf/7zH2VlZWnWrFm66aab7J6zZ88eSVKPHj10wQUXOOwzLCzsrM8RjnypwwUAAICvKzdX2Gow1Kai0qLN2UUqN1dQlNjH1FTwnEwGeIvbQYacnBw9+OCDOn36tOLj43Xq1Cm79dddd51OnDih7OxsPfzww3r//ffVoUOHsx6wK06fPq2JEyeqtLRUs2bN0siRIyVJZWVl+vOf/6zVq1drzpw5Sk1NrXNf27dv10svvaRmzZrppZdeUnJysm1dRkaGpk+frtTUVCUnJysuLs62Ljs7W5I0YcKERg+wBDtf6XABAADg60rLzHUGGKwslqrtCTL4jtoKnmdPSyXQAK9we7rEyy+/rNOnT2vMmDFauXKlzj//fLv1o0eP1ttvv63bbrtNP//8sxYuXHjWg3XVRx99pO+//159+vSxBRgkKTw8XE8//bQiIiL01ltv6dixY3Xu65133pEk/elPf7ILMEhV5zho0CCdOnVKq1atsltnzWRISko629MBAAAAGkREuFFOmsQ5ZTBUbQ/fQMFz+Cq3gwzbt2/Xb37zG02ePNlp+0pJMhgMeuKJJ9S8eXNt3LjR7UHW1+rVqyVJ11xzjcO61q1bKzk5WWazWevXr69zX+Hh4erSpYt69+7tdH3Hjh0lSQcO/Fpo5fjx4/r+++/Vvn17tWrVyo0zAAAAABpemDFUvZNiXarJ0CcpliwGH1FpNis7dYbTLhIOXSdSZ6jSbPbyiBFM3A4yHDlyROeff76aNm1a63ZhYWHq0KFDoxaA/OabbyRJXbt2dbq+U6dOkqS9e/fWua+nnnpKK1as0GWXXeZ0vbXwY0xMjG1ZTk6OJKl9+/aaP3++hg4dqosuukj9+vXTY489pv3797t+MgAAAEADGjYwQRWVtc+ZqKi0aNighEYaEepCwXP4MrdrMkRGRtrdva/NkSNHGrWl5cGDByXJrhDlmdq0aWO3nbtWr16tHTt2yGg02mVNWIMMGzZs0LZt23T55ZcrNjZWOTk5WrFihbKysrRgwQL16dOnxn1b24M4U1RUpNjY2LMaOwAAACBJiR0jNW5ETy1YvkuhIQa7gIP18bgRPWlf6WMoeA5f5XYmQ/fu3VVSUqKPP/641u3WrFmjoqIiJSYmunuoerO2qAwPD3e63rrcnVaWVl9//bWmTJkiqapew3nnnWdbZ63HcPnll2v16tV65ZVXtHDhQq1Zs0a33XabSktLNWHCBB0/ftzt4wMAAACeMqRvvGaP76/kxBhbjQaDQUpOjNHs8f01pG+8dwcIpyh4Dl/kdibDqFGjtGbNGj355JM6fvy4brrpJrupE6dOndKHH36oZ555RgaDQaNGjfLIgF0RGhqqysrKGmtFWFlcLaVbza5duzR27FgdPXpUV111lVJS7PvSPvvssxo/frzatGljl8HRtGlTTZ06VTt27NBXX32lzMxM3XHHHU6PkZWVVePxa8tyAAAAANzRPT5S3eMjVW6uUGmZWRHhRmowAKg3t4MMV199tX7/+9/rgw8+0FNPPaVZs2bpggsuUEREhH766ScVFBTo1KlTslgsuuGGG3T99dd7cty1at68uY4ePaqff/7Z6fqysjJJUrNmzeq9708++USTJ0/Wzz//rN/+9rd64YUXFBJinxDStGlTW0HI6kJDQ3XllVfqq6++0u7du+t9fAAAAKAhhRlDCS4AcJvbQQap6o59p06dtGjRIp04ccJWcNEqIiJCd999tx566KGzGmR9tWnTRkePHpXJZHJorSn9WovBWpvBVfPnz9c///lPWSwWjRkzRtOmTVNoaP1/AVvrKdQUBAEAAAAAwB+dVZAhJCREY8eO1R//+Edt375d3333nY4ePapmzZrpggsu0GWXXabmzZt7aqwu69q1q7755hvt27dPl1xyicP6ffv22bZzRWVlpZ588km99957Cg0N1eTJk3XnnXc63ba8vFxpaWk6fPiwnn76abVu3dphm6KiIkn2HSkA+AZSRAEAAAD3nVWQwcpoNKpPnz61dktoTIMGDdKKFSu0atUq3XLLLXbrjhw5oi1btshoNKpfv34u7W/atGl67733FBERoblz52rQoEE1bhsWFqaNGzeqqKhIWVlZGjlypN36U6dO6aOPPpIkXXnllfU7MQANJmf/IWWuy9Pn2UWyWKqKXfVOitXwQQlU0wYAAABc5HZ3idqUlJTIbDY3xK5dcs011yguLk4bNmzQ66+/blteVlamqVOnqrS0VCNHjlRU1K/9ZM1ms/Ly8pSXl2c39vfff1/Lly9XkyZNtGDBgloDDFZjxoyRJD333HPau3ev3fGnTJmigoICXX755S4HOYBAVG6u0JETZSo3V3h7KFq5KV+T52/Q1pxiWevBWizS1pxiTZq3QR9vyvfuAAEAAAA/YbDUs8XC559/rl27dumOO+6wK5x4+vRp/fOf/9SyZct08uRJhYSEqG/fvnr00UfVrVs3jw+8Llu2bNHYsWNVVlamxMREtWvXTjt37tTBgwfVvXt3LV261K7zww8//GDr2pCVlaV27dqpoqJCgwcPVlFRkdq2basrrriixuP1799fw4cPl1QVsHj44Ye1Zs0aNWnSRJdccolatWqlL774QocOHVLHjh21ZMkSRUdHu3VuZ44T8De+ljGQs/+QJs/fUOd2s8f3J6MBAAAAQcvV61CXp0scP35cDz30kLZv3y5Juv7669W+fXvb+vHjx2vt2rW2tpAVFRVav369tm/frnnz5jX6Xfvk5GS9/fbbmjdvnrZu3ap9+/apXbt2GjlypO699167AENNvv76a1v9hAMHDmjFihU1btuyZUtbkMFoNGrBggV6++23tXz5cmVnZ6uyslLnn3++xowZ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s2PHjrp06ZLWr1+vZs2aFbn9tWvX6qWXXtLVq1d10003qXnz5vrpp5+UmJgok8mk119/XXfddZehx+wujGy7o0ePasSIETp//ryCg4PVpk0bZWVl6dtvv9XVq1f1yCOPaPLkyXbrOnv2rKKjo3X69GmFhYWpVatWSk5O1rFjxxQYGKgPPvjAo1PbimJU282ZM0fvvPOOJKl///6Fvh/u5+enGTNm2H6m3znnm2++0ahRo5Sdna2WLVvqxhtv1L59+3T27FndeuutWrJkid0rJT/99JMtsBYfH283esfx48f18MMP68KFC2rcuLGaNWumw4cP69SpU2rQoIGWLVtWoCDnunXr9Ne//lUWi0Xt2rVTcHCw9u7dqwsXLqhnz55asGCBR3/pKooRbZebm6u+ffsqNTVV9erVU+fOnQvdXlRUlK3Qsdls1pgxY7Rlyxb5+vqqffv2CgoK0v/+9z+dO3dOjRs3VlxcnEJCQsr1HLgqI/vdokWL9MYbb0iSWrRooUaNGun48eM6efKkAgIC9O677xZ4Qk6/Kz0j206SvvzySz399NOKjIzUypUri9w2/c54b731lubPn6+HHnpIMTExdvO43lUszyzBDZcWEBCgJUuW6N1339Xnn3+uLVu2qFatWrrjjjv09NNPl7hwnNls1qVLlyT9/v5+UQYOHKgmTZro3Xff1d69e7V582YFBQXpnnvu0ZNPPml7TwsFGdl2zZs319q1a7Vw4UJt3bpVO3bsUEBAgLp06aKHHnrIYUZC3bp19fHHHys2NlabN2/W5s2bVbduXd133316+umnC60JAOPabsuWLbb/O0ozvH571wcZ6HfO6dKli1asWKH58+drz549OnHihG688UYNGTJEjz32WIlqVjRr1kyrVq3S/PnztWPHDm3ZskWhoaEaPny4nnrqKYcFze69917Vr1/flh105MgRNWzYUH/5y18UHR3t0V+4imNE2x09etT2HveZM2dsoyY5EhgYaAsymEwmxcbGasWKFVq5cqUSEhKUl5enhg0bKjo6Wo8++qgCAgIMOU53ZGS/GzVqlFq1aqX3339f33//vZKSkhQSEqKhQ4fqqaeecjj8MP2u9IxsO0m2zD1nvk/S76oOrnfGI5MBAAAAAAAYgpoMAAAAAADAEAQZAAAAAACAIQgyAAAAAAAAQxBkAAAAAAAAhiDIAAAA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f1RAQECB+V5eXvrTn/4kSdqyZYvD8wAAQGlRkwEAANgcP35ckpSWlqYHH3zQ4TLXP8U/efKkgoODdfvtt6tz587as2ePZs+erdmzZ6tx48bq3r27evbsqW7dusnPz69CjqGsfHx81KNHD9urIOfPn9c333yjrVu36vPPP9eVK1e0ZcsWvfXWW3r++eclST/++KMk6eabb5a/v7/D9YaHh9v+n5mZqTNnzkiSw2KQVtZAT3JycoF5hRVuPHbsmKRrAQRrhkl+Fy9elCT98MMPslgstqwLAADKiiADAACwuXTpkqRrN8HWooxFsd6s+vr66l//+pc+/PBDrVq1SseOHdPJkyd18uRJffDBB6pZs6Yef/xxPfXUUy53Q1u7dm3ddddduuuuuzRu3DiNGjVKx44d09KlSzV+/Hh5eXnpwoULkuQwc8CR3377zfb/mjVrFrqcdV5WVlaBYEBhQZvMzExJUmpqaoGMkvxyc3P122+/FbkPAACUBEEGAABgU716dUlS//79NW/evBJ9tlq1aho5cqRGjhyptLQ0ff311/rmm2+0fft2ZWRkaO7cufL397cNV1lV5ObmatiwYcrIyNCsWbPUpUuXQpetX7++JkyYoMcee0yZmZlKT09X3bp1beft+uBBUWrUqGH7vzUo4Ii1hkVAQIDTwRnrvvztb3+zGwEEAICKQE0GAABgc/PNN0v6/bUJRy5fvqw9e/bo9OnTys3NlXTtZnj//v22J+ehoaEaNGiQXn31VW3dulV9+vSRJNvwjlWJj4+PMjIylJKSYquTUBTraAze3t4KCgqS9Pt5+/HHH5WTk+Pwc8uWLdOIESP0r3/9SzVr1rS97pCQkFDotqzzihrVIj9n2jA1NVX79+/X2bNnnV4vAADOIMgAAABsevfuLR8fH508eVJfffWVw2UWL16s4cOHa+DAgbp8+bIk6aWXXtL//d//6d133y2wvMlkUufOnSXJFpSwsj6dr+wRta2FEJcvX66jR48Wuexnn30mSerevbutYGOHDh0UEBCgK1euaN26dQU+k5eXp08++US7d+9WVlaWJNkCL8uWLbMrImn166+/as2aNZKkXr16OX0s1vV+/vnntsKc+Vnba/z48U6vFwAAZxBkAAAANg0aNNADDzwgSRo/frw2b95sm5eXl6cVK1Zo/vz5kqSHHnrI9i6/dcSJjz76SGvWrLELGhw/ftw2BGPv3r3ttmetYZCSklJOR+SckSNH6qabblJWVpaGDx+uJUuWFBhu8/z583rjjTe0aNEi+fv7292g16xZUyNGjJAkvfrqq3bnLTs7WzNmzFBCQoJq1qxpG13iiSeeUI0aNXTs2DE9++yzdgGB06dP68knn1RGRobq1aunP//5z04fy4ABAxQREaGLFy/qscces8toyMzM1CuvvKJdu3bJy8tLo0aNKtF5AgCgOF6Wyn50AAAAKtRbb72l+fPnq0GDBnY3w1Y5OTl69tlnbcMb1q1bV/Xq1dPPP/+s8+fPS7pWs2HOnDny8fGxfe5vf/ubPv74Y0nXiiXWr19fmZmZOnXqlCwWi1q3bq3333/frsjgww8/rL1796patWpq1qyZoqOjNWTIkFIdl3V4zPfff1/du3cv8edTUlL03HPPaf/+/ZKuFbO88cYbFRgYqIsXL+rHH3+UxWJRcHCwZs2aVSC74OrVq3rhhRe0YcMGSdfqN9SuXVs//PCDfvvtN/n7+2vevHl2gZadO3fq2WefVWZmpkwmk5o2barc3FydOHFCeXl5CgsL0/z58+2GE7W2X/v27bVs2TKHx3L69Gk9/vjj+uGHHyRde4WievXq+uGHH2yZFC+99FKJghcAADiDwo8AAMCOn5+fFixYoA0bNmjVqlVKSEjQ4cOHVaNGDXXp0kX333+//vSnP8nb2z4hcurUqWrXrp3WrFmjo0eP6ujRo6pRo4Y6dOigAQMGaOjQoTKZTHafmTlzpl555RXt27dPycnJtpviyhAWFqbly5crPj5e8fHx2r9/v86fP6+ffvpJN9xwg9q1a6fbb79dQ4cO1Q033FDg876+vpozZ47uuOMOffLJJ0pMTNTRo0cVHBys/v37a9SoUbZ6CVZRUVH67LPP9P7772vbtm1KTk6WyWTSLbfcojvvvFPDhg1TYGBgiY+lYcOGWr16tZYtW6ZNmzYpKSlJ2dnZqlWrlnr27Knhw4erU6dOpT5XAAAUhkwGAAAAAABgCGoyAAAAAAAAQxBkAAAAAAAAhiDIAAAAAAAADEGQAQAAAAAAGIIgAwAAAAAAMARBBgAAAAAAYAiCDAAAAAAAwBAEGQAAAAAAgCEIMgAAAAAAAEMQZAAAAAAAAIYgyAAAAAAAAAxBkAEAAAAAABiCIAMAAAAAADDE/wNDar3yOwHoCAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "positive = data2[data2['accepted'].isin([1])]\n",
    "negative = data2[data2['accepted'].isin([0])]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(12,8))\n",
    "ax.scatter(positive['test1'], positive['test2'], s=50, c='b', marker='o', label='Accepted')\n",
    "ax.scatter(negative['test1'], negative['test2'], s=50, c='r', marker='x', label='Rejected')\n",
    "ax.legend()\n",
    "ax.set_xlabel('Test 1 Score')\n",
    "ax.set_ylabel('Test 2 Score')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "nKZFQDlUjlJY"
   },
   "source": [
    "哇，这个数据看起来可比前一次的复杂得多。特别地，你会注意到其中没有线性决策界限，来良好的分开两类数据。一个方法是用像逻辑回归这样的线性技术来构造从原始特征的多项式中得到的特征。让我们通过创建一组多项式特征入手吧。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "0WuhZaH9PyJv"
   },
   "outputs": [],
   "source": [
    "def feature_mapping(x, y, power, as_ndarray=False):\n",
    "#     \"\"\"return mapped features as ndarray or dataframe\"\"\"\n",
    "    # data = {}\n",
    "    # # inclusive\n",
    "    # for i in np.arange(power + 1):\n",
    "    #     for p in np.arange(i + 1):\n",
    "    #         data[\"f{}{}\".format(i - p, p)] = np.power(x, i - p) * np.power(y, p)\n",
    "\n",
    "    data = {\"f{}{}\".format(i - p, p): np.power(x, i - p) * np.power(y, p)\n",
    "                for i in np.arange(power + 1)\n",
    "                for p in np.arange(i + 1)\n",
    "            }\n",
    "\n",
    "    if as_ndarray:\n",
    "        return pd.DataFrame(data).as_matrix()\n",
    "    else:\n",
    "        return pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "sISiRom-jlJZ"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5, 28)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f00</th>\n",
       "      <th>f10</th>\n",
       "      <th>f01</th>\n",
       "      <th>f20</th>\n",
       "      <th>f11</th>\n",
       "      <th>f02</th>\n",
       "      <th>f30</th>\n",
       "      <th>f21</th>\n",
       "      <th>f12</th>\n",
       "      <th>f03</th>\n",
       "      <th>...</th>\n",
       "      <th>f23</th>\n",
       "      <th>f14</th>\n",
       "      <th>f05</th>\n",
       "      <th>f60</th>\n",
       "      <th>f51</th>\n",
       "      <th>f42</th>\n",
       "      <th>f33</th>\n",
       "      <th>f24</th>\n",
       "      <th>f15</th>\n",
       "      <th>f06</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>78</td>\n",
       "      <td>7225</td>\n",
       "      <td>6630</td>\n",
       "      <td>6084</td>\n",
       "      <td>614125</td>\n",
       "      <td>563550</td>\n",
       "      <td>517140</td>\n",
       "      <td>474552</td>\n",
       "      <td>...</td>\n",
       "      <td>3428638200</td>\n",
       "      <td>3146279760</td>\n",
       "      <td>2887174368</td>\n",
       "      <td>377149515625</td>\n",
       "      <td>346090143750</td>\n",
       "      <td>317588602500</td>\n",
       "      <td>291434247000</td>\n",
       "      <td>267433779600</td>\n",
       "      <td>245409821280</td>\n",
       "      <td>225199600704</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>90</td>\n",
       "      <td>85</td>\n",
       "      <td>8100</td>\n",
       "      <td>7650</td>\n",
       "      <td>7225</td>\n",
       "      <td>729000</td>\n",
       "      <td>688500</td>\n",
       "      <td>650250</td>\n",
       "      <td>614125</td>\n",
       "      <td>...</td>\n",
       "      <td>4974412500</td>\n",
       "      <td>4698056250</td>\n",
       "      <td>4437053125</td>\n",
       "      <td>531441000000</td>\n",
       "      <td>501916500000</td>\n",
       "      <td>474032250000</td>\n",
       "      <td>447697125000</td>\n",
       "      <td>422825062500</td>\n",
       "      <td>399334781250</td>\n",
       "      <td>377149515625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>78</td>\n",
       "      <td>80</td>\n",
       "      <td>6084</td>\n",
       "      <td>6240</td>\n",
       "      <td>6400</td>\n",
       "      <td>474552</td>\n",
       "      <td>486720</td>\n",
       "      <td>499200</td>\n",
       "      <td>512000</td>\n",
       "      <td>...</td>\n",
       "      <td>3115008000</td>\n",
       "      <td>3194880000</td>\n",
       "      <td>3276800000</td>\n",
       "      <td>225199600704</td>\n",
       "      <td>230973949440</td>\n",
       "      <td>236896358400</td>\n",
       "      <td>242970624000</td>\n",
       "      <td>249200640000</td>\n",
       "      <td>255590400000</td>\n",
       "      <td>262144000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>92</td>\n",
       "      <td>88</td>\n",
       "      <td>8464</td>\n",
       "      <td>8096</td>\n",
       "      <td>7744</td>\n",
       "      <td>778688</td>\n",
       "      <td>744832</td>\n",
       "      <td>712448</td>\n",
       "      <td>681472</td>\n",
       "      <td>...</td>\n",
       "      <td>5767979008</td>\n",
       "      <td>5517197312</td>\n",
       "      <td>5277319168</td>\n",
       "      <td>606355001344</td>\n",
       "      <td>579991740416</td>\n",
       "      <td>554774708224</td>\n",
       "      <td>530654068736</td>\n",
       "      <td>507582152704</td>\n",
       "      <td>485513363456</td>\n",
       "      <td>464404086784</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>88</td>\n",
       "      <td>85</td>\n",
       "      <td>7744</td>\n",
       "      <td>7480</td>\n",
       "      <td>7225</td>\n",
       "      <td>681472</td>\n",
       "      <td>658240</td>\n",
       "      <td>635800</td>\n",
       "      <td>614125</td>\n",
       "      <td>...</td>\n",
       "      <td>4755784000</td>\n",
       "      <td>4593655000</td>\n",
       "      <td>4437053125</td>\n",
       "      <td>464404086784</td>\n",
       "      <td>448572129280</td>\n",
       "      <td>433279897600</td>\n",
       "      <td>418508992000</td>\n",
       "      <td>404241640000</td>\n",
       "      <td>390460675000</td>\n",
       "      <td>377149515625</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 28 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   f00  f10  f01   f20   f11   f02     f30     f21     f12     f03  ...  \\\n",
       "0    1   85   78  7225  6630  6084  614125  563550  517140  474552  ...   \n",
       "1    1   90   85  8100  7650  7225  729000  688500  650250  614125  ...   \n",
       "2    1   78   80  6084  6240  6400  474552  486720  499200  512000  ...   \n",
       "3    1   92   88  8464  8096  7744  778688  744832  712448  681472  ...   \n",
       "4    1   88   85  7744  7480  7225  681472  658240  635800  614125  ...   \n",
       "\n",
       "          f23         f14         f05           f60           f51  \\\n",
       "0  3428638200  3146279760  2887174368  377149515625  346090143750   \n",
       "1  4974412500  4698056250  4437053125  531441000000  501916500000   \n",
       "2  3115008000  3194880000  3276800000  225199600704  230973949440   \n",
       "3  5767979008  5517197312  5277319168  606355001344  579991740416   \n",
       "4  4755784000  4593655000  4437053125  464404086784  448572129280   \n",
       "\n",
       "            f42           f33           f24           f15           f06  \n",
       "0  317588602500  291434247000  267433779600  245409821280  225199600704  \n",
       "1  474032250000  447697125000  422825062500  399334781250  377149515625  \n",
       "2  236896358400  242970624000  249200640000  255590400000  262144000000  \n",
       "3  554774708224  530654068736  507582152704  485513363456  464404086784  \n",
       "4  433279897600  418508992000  404241640000  390460675000  377149515625  \n",
       "\n",
       "[5 rows x 28 columns]"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "degree = 5\n",
    "# 假设 df 中的列名是 'exam1' 和 'exam2'\n",
    "x1 = np.array(df['exam1'])\n",
    "x2 = np.array(df['exam2'])\n",
    "\n",
    "# 假设 feature_mapping 是一个已经定义的函数\n",
    "data = feature_mapping(x1, x2, power=6)\n",
    "print(data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "UaNs-uSEjlJe"
   },
   "source": [
    "现在，我们需要修改第1部分的成本和梯度函数，包括正则化项。首先是成本函数："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "YgE_bAV2jlJe"
   },
   "source": [
    "## Regularized cost（正则化代价函数）\n",
    "$$J\\left( \\theta  \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}+\\frac{\\lambda }{2m}\\sum\\limits_{j=1}^{n}{\\theta _{j}^{2}}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "qBnOVnA9RI1v"
   },
   "outputs": [],
   "source": [
    "def feature_mapping(x, y, power, as_ndarray=True):\n",
    "    # 生成特征映射\n",
    "    data = {\"f{}{}\".format(i - p, p): np.power(x, i - p) * np.power(y, p)\n",
    "            for i in np.arange(power + 1)\n",
    "            for p in np.arange(i + 1)\n",
    "           }\n",
    "\n",
    "    if as_ndarray:\n",
    "        return pd.DataFrame(data).to_numpy()  # 使用 to_numpy() 替代 as_matrix()\n",
    "    else:\n",
    "        return pd.DataFrame(data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Kkw1EX4DjlJg"
   },
   "outputs": [],
   "source": [
    "X = np.c_[np.ones((X.shape[0], 1)), X]  # 在 X 的第一列添加偏置项\n",
    "\n",
    "def regularized_cost(theta, X, y, l=1):\n",
    "    '''计算正则化代价函数'''\n",
    "    # 不惩罚 theta_0\n",
    "    theta_j1_to_n = theta[1:]  # 不包括 theta_0\n",
    "    regularized_term = (l / (2 * len(X))) * np.sum(np.power(theta_j1_to_n, 2))  # 正则化项\n",
    "    \n",
    "    # 计算普通代价函数\n",
    "    return cost(theta, X, y) + regularized_term\n",
    "\n",
    "def cost(theta, X, y):\n",
    "    '''计算代价函数'''\n",
    "    m = len(y)\n",
    "    return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))\n",
    "\n",
    "def sigmoid(z):\n",
    "    '''sigmoid 函数'''\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "207-7syrRNE_"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6931471805599453\n"
     ]
    }
   ],
   "source": [
    "# 假设 X 是 3 个样本，每个样本有 2 个特征（不包括偏置项）\n",
    "X = np.array([[2, 3], [3, 4], [4, 5]])\n",
    "\n",
    "# 在 X 的第一列添加偏置项（全为 1）\n",
    "X = np.c_[np.ones((X.shape[0], 1)), X]  # 这样 X 的形状变为 (3, 3)\n",
    "\n",
    "# 标签 y\n",
    "y = np.array([0, 1, 0])\n",
    "\n",
    "# 初始化 theta，包含偏置项（长度为 3）\n",
    "theta = np.array([0, 0, 0])\n",
    "\n",
    "# 计算代价函数和正则化代价函数\n",
    "print(regularized_cost(theta, X, y, l=1))  # 正则化代价函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5nkQHdeGRtF2"
   },
   "source": [
    "## Regularized gradient(正则化梯度) \n",
    "\n",
    "$$\\frac{\\partial J\\left( \\theta  \\right)}{\\partial {{\\theta }_{j}}}=\\left( \\frac{1}{m}\\sum\\limits_{i=1}^{m}{\\left( {{h}_{\\theta }}\\left( {{x}^{\\left( i \\right)}} \\right)-{{y}^{\\left( i \\right)}} \\right)} \\right)+\\frac{\\lambda }{m}{{\\theta }_{j}}\\text{ }\\text{             for  j}\\ge \\text{1}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "1BnWF1tEjlJj"
   },
   "source": [
    "请注意等式中的\"reg\" 项。还注意到另外的一个“学习率”参数。这是一种超参数，用来控制正则化项。现在我们需要添加正则化梯度函数："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ycKcQ0ndjlJk"
   },
   "source": [
    "如果我们要使用梯度下降法令这个代价函数最小化，因为我们未对${{\\theta }_{0}}$ 进行正则化，所以梯度下降算法将分两种情形：\n",
    "\\begin{align}\n",
    "  & Repeat\\text{ }until\\text{ }convergence\\text{ }\\!\\!\\{\\!\\!\\text{ } \\\\ \n",
    " & \\text{     }{{\\theta }_{0}}:={{\\theta }_{0}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{_{0}}^{(i)}} \\\\ \n",
    " & \\text{     }{{\\theta }_{j}}:={{\\theta }_{j}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{j}^{(i)}}+\\frac{\\lambda }{m}{{\\theta }_{j}} \\\\ \n",
    " & \\text{          }\\!\\!\\}\\!\\!\\text{ } \\\\ \n",
    " & Repeat \\\\ \n",
    "\\end{align}\n",
    "\n",
    "对上面的算法中 j=1,2,...,n 时的更新式子进行调整可得： \n",
    "${{\\theta }_{j}}:={{\\theta }_{j}}(1-a\\frac{\\lambda }{m})-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{({{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}})x_{j}^{(i)}}$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "cwxZ64B4jlJm"
   },
   "outputs": [],
   "source": [
    "def regularized_gradient(theta, X, y, l=1):\n",
    "    '''计算正则化梯度，theta_0 不受惩罚'''\n",
    "    theta_j1_to_n = theta[1:]  # 排除 theta_0\n",
    "    regularized_theta = (l / len(X)) * theta_j1_to_n\n",
    "    \n",
    "    # 保持 theta_0 为 0，其他部分加上正则化项\n",
    "    regularized_term = np.concatenate([np.array([0]), regularized_theta])\n",
    "\n",
    "    # 假设 gradient 函数已定义，计算普通梯度并加上正则化项\n",
    "    return gradient(theta, X, y) + regularized_term\n",
    "\n",
    "# 示例的 gradient 函数（这里只是一个简单的梯度计算，实际根据需求修改）\n",
    "def gradient(theta, X, y):\n",
    "    '''计算逻辑回归的梯度'''\n",
    "    m = len(y)\n",
    "    return (1 / m) * X.T @ (sigmoid(X @ theta) - y)\n",
    "def sigmoid(z):\n",
    "    '''sigmoid 函数'''\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "m3mVnObqjlJo"
   },
   "source": [
    "就像在第一部分中做的一样，初始化变量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "SQJGX8C5jlJq"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.16666667, 0.5       , 0.66666667])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regularized_gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3HDWjlJrjlJs"
   },
   "source": [
    "让我们初始学习率到一个合理值。，果有必要的话（即如果惩罚太强或不够强）,我们可以之后再折腾这个。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Ra_Rd5sFjlJs"
   },
   "outputs": [],
   "source": [
    "learningRate = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "c3oj6HgkjlJv"
   },
   "source": [
    "现在，让我们尝试调用新的默认为0的theta的正则化函数，以确保计算工作正常。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "haAzSuP3jlJw"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6931471805599453\n"
     ]
    }
   ],
   "source": [
    "# 假设 X2 是一个 (3, 2) 的矩阵，即 3 个样本，2 个特征（包含偏置项）\n",
    "X2 = np.array([[1, 2], [2, 3], [3, 4]])  # 3 个样本，2 个特征\n",
    "y2 = np.array([0, 1, 0])  # 标签\n",
    "\n",
    "# 初始化 theta2，长度为 X2 的列数\n",
    "theta2 = np.zeros(X2.shape[1])  # 初始化为全 0\n",
    "\n",
    "# 学习率\n",
    "learningRate = 1\n",
    "\n",
    "# 调用正则化代价函数，并正确关闭括号\n",
    "print(regularized_cost(theta2, X2, y2, l=learningRate))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Co_DCQqPjlJ8"
   },
   "source": [
    "现在我们可以使用和第一部分相同的优化函数来计算优化后的结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "twdWMetWSeAd"
   },
   "source": [
    "## 拟合参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "rb6a5ASMSg09"
   },
   "outputs": [],
   "source": [
    "import scipy.optimize as opt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "AXbKitbDSiqS"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init cost = 0.6931471805599453\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       " message: Optimization terminated successfully.\n",
       " success: True\n",
       "  status: 0\n",
       "     fun: 0.6365141682948134\n",
       "       x: [-6.931e-01 -2.734e-08 -3.685e-08]\n",
       "     nit: 6\n",
       "     jac: [ 3.854e-08  6.511e-08  1.708e-07]\n",
       "    nfev: 7\n",
       "    njev: 33\n",
       "    nhev: 0"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print('init cost = {}'.format(regularized_cost(theta, X, y)))\n",
    "\n",
    "res = opt.minimize(fun=regularized_cost, x0=theta, args=(X, y), method='Newton-CG', jac=regularized_gradient)\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "UyNK7mUXjlJ_"
   },
   "source": [
    "最后，我们可以使用第1部分中的预测函数来查看我们的方案在训练数据上的准确度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8D7uUrYGSrW6"
   },
   "source": [
    "## 预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "koAbf3UhStRU"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.67      1.00      0.80         2\n",
      "           1       0.00      0.00      0.00         1\n",
      "\n",
      "    accuracy                           0.67         3\n",
      "   macro avg       0.33      0.50      0.40         3\n",
      "weighted avg       0.44      0.67      0.53         3\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\python for picture\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "D:\\python for picture\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "D:\\python for picture\\Lib\\site-packages\\sklearn\\metrics\\_classification.py:1509: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
     ]
    }
   ],
   "source": [
    "final_theta = res.x\n",
    "y_pred = predict(final_theta, X)\n",
    "\n",
    "print(classification_report(y, y_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "_yLVQLTFjlKI"
   },
   "source": [
    "虽然我们实现了这些算法，值得注意的是，我们还可以使用高级Python库像scikit-learn来解决这个问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "cih8ekDVjlKK"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "LogisticRegression()"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import linear_model#调用sklearn的线性回归包\n",
    "model = linear_model.LogisticRegression(penalty='l2', C=1.0)\n",
    "model.fit(X2, y2.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "jaT8naLtjlKM"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6666666666666666"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.score(X2, y2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "A-SkdKuQjlKP"
   },
   "source": [
    "这个准确度和我们刚刚实现的差了好多，不过请记住这个结果可以使用默认参数下计算的结果。我们可能需要做一些参数的调整来获得和我们之前结果相同的精确度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ioOB1lqPUlp7"
   },
   "source": [
    "## 使用不同的 $\\lambda$ \n",
    "### 画出决策边界\n",
    "* 我们找到所有满足 $X\\times \\theta = 0$ 的x\n",
    "* instead of solving polynomial equation, just create a coridate x,y grid that is dense enough, and find all those $X\\times \\theta$ that is close enough to 0, then plot them"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "wgDzdelZjBa6"
   },
   "outputs": [],
   "source": [
    "def draw_boundary(power, l):\n",
    "#     \"\"\"\n",
    "#     power: polynomial power for mapped feature\n",
    "#     l: lambda constant\n",
    "#     \"\"\"\n",
    "    density = 1000\n",
    "    threshhold = 2 * 10**-3\n",
    "\n",
    "    final_theta = feature_mapped_logistic_regression(power, l)\n",
    "    x, y = find_decision_boundary(density, power, final_theta, threshhold)\n",
    "\n",
    "    df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n",
    "    sns.lmplot('test1', 'test2', hue='accepted', data=df, size=6, fit_reg=False, scatter_kws={\"s\": 100})\n",
    "\n",
    "    plt.scatter(x, y, c='R', s=10)\n",
    "    plt.title('Decision boundary')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "SK7PmPjkjBa-"
   },
   "outputs": [],
   "source": [
    "def feature_mapped_logistic_regression(power, l):\n",
    "#     \"\"\"for drawing purpose only.. not a well generealize logistic regression\n",
    "#     power: int\n",
    "#         raise x1, x2 to polynomial power\n",
    "#     l: int\n",
    "#         lambda constant for regularization term\n",
    "#     \"\"\"\n",
    "    df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n",
    "    x1 = np.array(df.test1)\n",
    "    x2 = np.array(df.test2)\n",
    "    y = get_y(df)\n",
    "\n",
    "    X = feature_mapping(x1, x2, power, as_ndarray=True)\n",
    "    theta = np.zeros(X.shape[1])\n",
    "\n",
    "    res = opt.minimize(fun=regularized_cost,\n",
    "                       x0=theta,\n",
    "                       args=(X, y, l),\n",
    "                       method='TNC',\n",
    "                       jac=regularized_gradient)\n",
    "    final_theta = res.x\n",
    "\n",
    "    return final_theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "GqbGlpA7jBbB"
   },
   "outputs": [],
   "source": [
    "def find_decision_boundary(density, power, theta, threshhold):\n",
    "    t1 = np.linspace(-1, 1.5, density)\n",
    "    t2 = np.linspace(-1, 1.5, density)\n",
    "\n",
    "    cordinates = [(x, y) for x in t1 for y in t2]\n",
    "    x_cord, y_cord = zip(*cordinates)\n",
    "    mapped_cord = feature_mapping(x_cord, y_cord, power)  # this is a dataframe\n",
    "\n",
    "    inner_product = mapped_cord.as_matrix() @ theta\n",
    "\n",
    "    decision = mapped_cord[np.abs(inner_product) < threshhold]\n",
    "\n",
    "    return decision.f10, decision.f01\n",
    "#寻找决策边界函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "JZWGQjWljBbJ",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "def find_decision_boundary(density, power, theta, threshhold):\n",
    "    '''找到决策边界'''\n",
    "    cordinates = []\n",
    "    for x in np.linspace(-1, 1, density):\n",
    "        for y in np.linspace(-1, 1, density):\n",
    "            cordinates.append((x, y))\n",
    "    \n",
    "    # 获取坐标数据并进行特征映射\n",
    "    x_cord, y_cord = zip(*cordinates)\n",
    "    mapped_cord = feature_mapping(x_cord, y_cord, power)  # 这里返回的是一个 NumPy 数组或 DataFrame\n",
    "    \n",
    "    # 如果 mapped_cord 是 DataFrame，使用 to_numpy()，否则直接使用它\n",
    "    if isinstance(mapped_cord, pd.DataFrame):\n",
    "        inner_product = mapped_cord.to_numpy() @ theta\n",
    "    else:\n",
    "        inner_product = mapped_cord @ theta  # 如果是 NumPy 数组，直接进行矩阵运算\n",
    "\n",
    "    # 找到符合条件的决策边界点\n",
    "    decision = mapped_cord[np.abs(inner_product) < threshhold]\n",
    "    \n",
    "    return decision[:, 0], decision[:, 1]  # 这里返回前两列的 x, y 坐标\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "CLBBoc6ZjBbN"
   },
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "lmplot() got multiple values for argument 'data'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[92], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m draw_boundary(power\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m6\u001b[39m, l\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n",
      "Cell \u001b[1;32mIn[85], line 13\u001b[0m, in \u001b[0;36mdraw_boundary\u001b[1;34m(power, l)\u001b[0m\n\u001b[0;32m     10\u001b[0m x, y \u001b[38;5;241m=\u001b[39m find_decision_boundary(density, power, final_theta, threshhold)\n\u001b[0;32m     12\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mex2data2.txt\u001b[39m\u001b[38;5;124m'\u001b[39m, names\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtest1\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtest2\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124maccepted\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m---> 13\u001b[0m sns\u001b[38;5;241m.\u001b[39mlmplot(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtest1\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtest2\u001b[39m\u001b[38;5;124m'\u001b[39m, hue\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maccepted\u001b[39m\u001b[38;5;124m'\u001b[39m, data\u001b[38;5;241m=\u001b[39mdf, size\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m6\u001b[39m, fit_reg\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m, scatter_kws\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m100\u001b[39m})\n\u001b[0;32m     15\u001b[0m plt\u001b[38;5;241m.\u001b[39mscatter(x, y, c\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mR\u001b[39m\u001b[38;5;124m'\u001b[39m, s\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m)\n\u001b[0;32m     16\u001b[0m plt\u001b[38;5;241m.\u001b[39mtitle(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDecision boundary\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
      "\u001b[1;31mTypeError\u001b[0m: lmplot() got multiple values for argument 'data'"
     ]
    }
   ],
   "source": [
    "draw_boundary(power=6, l=0)  # no regularization, over fitting，#lambda=0,没有正则化，过拟合了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zkOZ5XMZjBbS"
   },
   "outputs": [],
   "source": [
    "draw_boundary(power=6, l=100)  # underfitting，#lambda=100,欠拟合"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "ML-Exercise2.ipynb",
   "provenance": [],
   "toc_visible": true,
   "version": "0.3.2"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
